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 相关文章推荐
spyder常用快捷键(分享)
Jul 19 Python
python生成excel的实例代码
Nov 08 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
对python中类的继承与方法重写介绍
Jan 20 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
简单了解python的内存管理机制
Jul 08 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
python 图像增强算法实现详解
Jan 24 Python
Python 流媒体播放器的实现(基于VLC)
Apr 28 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如何执行非缓冲查询API
2016/07/22 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
js脚本实现数据去重
2014/11/27 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python字典排序实例详解
2015/05/20 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python3.6简单反射操作示例
2018/06/14 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python分数表示方式和写法
2019/06/26 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
Python shutil模块用法实例分析
2019/10/02 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
成品仓管员工作职责
2013/12/29 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
小学生环保标语
2014/06/13 职场文书
小学语文教研活动总结
2014/07/01 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
工作简报怎么写
2015/07/21 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书