Python爬虫的两套解析方法和四种爬虫实现过程


Posted in Python onJuly 20, 2018

对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式。因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门。本文想针对某一网页对  python 基础爬虫的两大解析库(  BeautifulSoup 和  lxml )和几种信息提取实现方法进行分析,以开  python 爬虫之初见。

基础爬虫的固定模式

笔者这里所谈的基础爬虫,指的是不需要处理像异步加载、验证码、代理等高阶爬虫技术的爬虫方法。一般而言,基础爬虫的两大请求库 urllib 和  requests 中  requests 通常为大多数人所钟爱,当然  urllib 也功能齐全。两大解析库  BeautifulSoup 因其强大的  HTML 文档解析功能而备受青睐,另一款解析库  lxml 在搭配  xpath 表达式的基础上也效率提高。就基础爬虫来说,两大请求库和两大解析库的组合方式可以依个人偏好来选择。

笔者喜欢用的爬虫组合工具是:

  • requests +  BeautifulSoup
  • requests +  lxml

同一网页爬虫的四种实现方式

笔者以腾讯新闻首页的新闻信息抓取为例。

首页外观如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看 HTML 源码确定新闻标题信息组织形式。

Python爬虫的两套解析方法和四种爬虫实现过程 

可以目标信息存在于 em 标签下  a 标签内的文本和  href 属性中。可直接利用  requests 库构造请求,并用  BeautifulSoup 或者  lxml 进行解析。

方式一: requests +  BeautifulSoup +  select css选择器

# select method
 import requests
 from bs4 import BeautifulSoup
 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'} 
 url = 'http://news.qq.com/' 
 Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml')
 em = Soup.select('em[class="f14 l24"] a')
 for i in em:
   title = i.get_text()
   link = i['href']
   print({'标题': title, 
 '链接': link
   })

很常规的处理方式,抓取效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

方式二: requests +  BeautifulSoup +  find_all 进行信息提取

# find_all method
 import requests
 from bs4 import BeautifulSoup
 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
 url = 'http://news.qq.com/'
 Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml') 
 em = Soup.find_all('em', attrs={'class': 'f14 l24'})for i in em:
   title = i.a.get_text()
   link = i.a['href']
   print({'标题': title,
      '链接': link
   })

同样是 requests +  BeautifulSoup 的爬虫组合,但在信息提取上采用了  find_all 的方式。效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

方式三: requests +  lxml/etree +  xpath 表达式

# lxml/etree method
 import requests
 from lxml import etree 
 headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
 url = 'http://news.qq.com/'
 html = requests.get(url = url, headers = headers)
 con = etree.HTML(html.text)
 title = con.xpath('//em[@class="f14 l24"]/a/text()')
 link = con.xpath('//em[@class="f14 l24"]/a/@href')
 for i in zip(title, link):
   print({'标题': i[0],
 '链接': i[1]
   })

使用 lxml 库下的  etree 模块进行解析,然后使用  xpath 表达式进行信息提取,效率要略高于  BeautifulSoup +  select 方法。这里对两个列表的组合采用了  zip 方法。python学习交流群:125240963效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

方式四: requests +  lxml/html/fromstring +  xpath 表达式

# lxml/html/fromstring method
 import requests
 import lxml.html as HTML 
 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
 url = 'http://news.qq.com/'
 con = HTML.fromstring(requests.get(url = url, headers = headers).text)
 title = con.xpath('//em[@class="f14 l24"]/a/text()')
 link = con.xpath('//em[@class="f14 l24"]/a/@href')
 for i in zip(title, link):
   print({'标题': i[0],'链接': i[1]
   })

跟方法三类似,只是在解析上使用了 lxml 库下的  html.fromstring 模块。抓取效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要python熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

总结

以上所述是小编给大家介绍的Python爬虫的两套解析方法和四种爬虫实现过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
删除目录下相同文件的python代码(逐级优化)
May 25 Python
python获取一组汉字拼音首字母的方法
Jul 01 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
python3连接MySQL数据库实例详解
May 24 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python 图像对比度增强的几种方法(小结)
Sep 25 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
Python中and和or如何使用
May 28 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
使用python脚本实现查询火车票工具
Jul 19 #Python
Python 判断文件或目录是否存在的实例代码
Jul 19 #Python
Flask框架Jinjia模板常用语法总结
Jul 19 #Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 #Python
python代码过长的换行方法
Jul 19 #Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 #Python
python多行字符串拼接使用小括号的方法
Mar 19 #Python
You might like
PHP 和 HTML
2006/10/09 PHP
PHP脚本的10个技巧(7)
2006/10/09 PHP
ADODB的数据库封包程序库
2006/12/31 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
javascript 写类方式之七
2009/07/05 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Shell编程面试题
2012/05/30 面试题
体育教育专业毕业生自荐信
2013/11/15 职场文书
高中地理教学反思
2014/01/29 职场文书
科研先进个人典型材料
2014/01/31 职场文书
市场营销战略计划书
2014/05/06 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python