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 相关文章推荐
Python3中的json模块使用详解
May 05 Python
对pandas replace函数的使用方法小结
May 18 Python
python 利用栈和队列模拟递归的过程
May 29 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
Python反射和内置方法重写操作详解
Aug 27 Python
python实现多进程代码示例
Oct 31 Python
python实现整数的二进制循环移位
Mar 08 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
Mar 27 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 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
基于MySQL体系结构的分析
2013/05/02 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
Python异常的检测和处理方法
2018/10/26 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
python实现的发邮件功能示例
2019/09/11 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
django rest framework serializers序列化实例
2020/05/13 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
Python打印不合法的文件名
2020/07/31 Python
python中K-means算法基础知识点
2021/01/25 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
护士见习期自我鉴定
2014/02/08 职场文书
教师节商场活动方案
2014/02/13 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
奥巴马当选演讲稿
2014/09/10 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL