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第八周:详解网络编程基础(socket)
Dec 14 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
python替换字符串中的子串图文步骤
Jun 19 Python
Pytorch加载部分预训练模型的参数实例
Aug 18 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
python同时遍历两个list用法说明
May 02 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
python 下划线的多种应用场景总结
May 12 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数据浏览器
2006/10/09 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
javascript各种复制代码收集
2008/09/20 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
js实现楼层导航功能
2017/02/23 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
Django Rest framework之权限的实现示例
2018/12/17 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python中K-means算法基础知识点
2021/01/25 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
办公室人员先进事迹
2014/01/27 职场文书
挂职自我鉴定
2014/02/26 职场文书
我的祖国演讲稿
2014/05/04 职场文书
员工保密协议书
2014/09/27 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python