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 相关文章推荐
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
简介Django中内置的一些中间件
Jul 24 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
八大排序算法的Python实现
Jan 28 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
python 中如何获取列表的索引
Jul 02 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
pytorch:实现简单的GAN示例(MNIST数据集)
Jan 10 Python
超详细Python解释器新手安装教程
May 10 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
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
PHP数据过滤的方法
2013/10/30 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
python分治法求二维数组局部峰值方法
2018/04/03 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
培训主管岗位职责
2014/02/01 职场文书
企业授权委托书范本
2014/04/02 职场文书
经典演讲稿开场白
2014/08/25 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
红色革命电影观后感
2015/06/18 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis