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的Tornado框架中实现简单的在线代理的教程
May 02 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
整理Python 常用string函数(收藏)
May 30 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
Python学习笔记之变量、自定义函数用法示例
May 28 Python
Django实现简单网页弹出警告代码
Nov 15 Python
python groupby 函数 as_index详解
Dec 16 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
Python如何测试stdout输出
Aug 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 zend 相对路径问题
2009/01/12 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
简单实现php上传文件功能
2017/09/21 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
jQuery常见开发技巧详细整理
2013/01/02 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python3+opencv3识别图片中的物体并截取的方法
2018/12/05 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
Python中的asyncio代码详解
2019/06/10 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
本科生求职信
2014/06/17 职场文书
学生吸烟检讨书
2014/09/14 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
银行竞聘报告范文
2014/11/06 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript