Python使用lxml模块和Requests模块抓取HTML页面的教程


Posted in Python onMay 16, 2016

Web抓取
Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中 获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据。

这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据进行收集 并整理成所需格式,同时保存其结构的实践。

lxml和Requests
lxml(http://lxml.de/)是一个优美的扩展库,用来快速解析XML以及HTML文档 即使所处理的标签非常混乱。我们也将使用 Requests (http://docs.python-requests.org/en/latest/#)模块取代内建的urllib2模块,因为其速度更快而且可读性更好。你可以通过使用 pip install lxml 与 pip install requests 命令来安装这两个模块。

让我们以下面的导入开始:

from lxml import html
import requests

下一步我们将使用 requests.get 来从web页面中取得我们的数据, 通过使用 html 模块解析它,并将结果保存到 tree 中。

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.text)

tree 现在包含了整个HTML文件到一个优雅的树结构中,我们可以使用两种 方法访问:XPath以及CSS选择器。在这个例子中,我们将选择前者。

XPath是一种在结构化文档(如HTML或XML)中定位信息的方式。一个关于XPath的 不错的介绍参见 W3Schools 。

有很多工具可以获取元素的XPath,如Firefox的FireBug或者Chrome的Inspector。 如果你使用Chrome,你可以右键元素,选择 ‘Inspect element',高亮这段代码, 再次右击,并选择 ‘Copy XPath'。

在进行一次快速分析后,我们看到在页面中的数据保存在两个元素中,一个是title是 ‘buyer-name' 的div,另一个class是 ‘item-price' 的span:

<div title="buyer-name">Carson Busses</div>
<span class="item-price">$29.95</span>

知道这个后,我们可以创建正确的XPath查询并且使用lxml的 xpath 函数, 像下面这样:

#这将创建buyers的列表:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#这将创建prices的列表:
prices = tree.xpath('//span[@class="item-price"]/text()')

让我们看看我们得到了什么:

print 'Buyers: ', buyers
print 'Prices: ', prices
Buyers: ['Carson Busses', 'Earl E. Byrd', 'Patty Cakes',
'Derri Anne Connecticut', 'Moe Dess', 'Leda Doggslife', 'Dan Druff',
'Al Fresco', 'Ido Hoe', 'Howie Kisses', 'Len Lease', 'Phil Meup',
'Ira Pent', 'Ben D. Rules', 'Ave Sectomy', 'Gary Shattire',
'Bobbi Soks', 'Sheila Takya', 'Rose Tattoo', 'Moe Tell']

Prices: ['$29.95', '$8.37', '$15.26', '$19.25', '$19.25',
'$13.99', '$31.57', '$8.49', '$14.47', '$15.86', '$11.11',
'$15.98', '$16.27', '$7.50', '$50.85', '$14.26', '$5.68',
'$15.00', '$114.07', '$10.09']

恭喜!我们已经成功地通过lxml与Request,从一个web页面中抓取了所有我们想要的 数据。我们将它们以列表的形式存在内存中。现在我们可以对它做各种很酷的事情了: 我们可以使用Python分析它,或者我们可以将之保存为一个文件并向世界分享。

我们可以考虑一些更酷的想法:修改这个脚本来遍历该例数据集中剩余的页面,或者 使用多线程重写这个应用从而提升它的速度。

Python 相关文章推荐
socket + select 完成伪并发操作的实例
Aug 15 Python
基于python log取对数详解
Jun 08 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Django 表单模型选择框如何使用分组
May 16 Python
Python自定义一个异常类的方法
Jun 27 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
python pandas dataframe 去重函数的具体使用
Jul 20 Python
python基于openpyxl生成excel文件
Dec 23 Python
Python 数据可视化之Seaborn详解
Nov 02 Python
Python 绘制多因子柱状图
May 11 Python
python操作字典类型的常用方法(推荐)
May 16 #Python
python字典的常用操作方法小结
May 16 #Python
浅析Python 中整型对象存储的位置
May 16 #Python
python字符类型的一些方法小结
May 16 #Python
浅谈Python 中整型对象的存储问题
May 16 #Python
Python对文件操作知识汇总
May 15 #Python
python实现SMTP邮件发送功能
Jun 16 #Python
You might like
PHP4之真OO
2006/10/09 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
from表单多个按钮提交用onclick跳转不同action
2014/04/24 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
javascript实现密码验证
2015/11/10 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
JS实现字体背景跑马灯
2020/01/06 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
详解Python多线程下的list
2020/07/03 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
非常详细的C#面试题集
2016/07/13 面试题
养殖行业的创业计划书
2014/01/05 职场文书
单位办理社保介绍信
2014/01/10 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
利用 JavaScript 构建命令行应用
2021/11/17 Javascript