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清除指定目录内所有文件中script的方法
Jun 30 Python
python正则表达式之作业计算器
Mar 18 Python
Python递归函数定义与用法示例
Jun 02 Python
Python request设置HTTPS代理代码解析
Feb 12 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
使用Python实现跳帧截取视频帧
May 31 Python
python实现PID算法及测试的例子
Aug 08 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
python监控nginx端口和进程状态
Sep 06 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
深入PHP magic quotes的详解
2013/06/17 PHP
简单的php文件上传(实例)
2013/10/27 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python进程间通信用法实例
2015/06/04 Python
python ansible服务及剧本编写
2017/12/29 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
岗位职责的含义
2013/11/17 职场文书
大学校园毕业自我鉴定
2014/01/15 职场文书
白酒营销策划方案
2014/08/17 职场文书
法院个人总结
2015/03/03 职场文书
党小组考察意见
2015/06/02 职场文书
学会感恩主题班会
2015/08/12 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
你知道Java Spring的两种事务吗
2022/03/16 Java/Android
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技
python标准库ElementTree处理xml
2022/05/20 Python