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 cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
如何利用python查找电脑文件
Apr 27 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
python set集合使用方法解析
Nov 05 Python
django框架F&Q 聚合与分组操作示例
Dec 12 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
解决c++调用python中文乱码问题
Jul 29 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 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实现ping
2006/10/09 PHP
php 动态添加记录
2009/03/10 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
理解javascript async的用法
2017/08/22 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
python装饰器与递归算法详解
2016/02/18 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python实现从wind导入数据
2019/12/03 Python
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
个人借条范本
2015/05/25 职场文书
老舍《猫》教学反思
2016/02/17 职场文书
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS