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 生成目录树及显示文件大小的代码
Jul 23 Python
整理Python 常用string函数(收藏)
May 30 Python
Django返回json数据用法示例
Sep 18 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
pandas数值计算与排序方法
Apr 12 Python
python实现公司年会抽奖程序
Jan 22 Python
selenium+python环境配置教程详解
May 28 Python
Python 硬币兑换问题
Jul 29 Python
Python日志处理模块logging用法解析
May 19 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
python单向链表实例详解
May 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
php的access操作类
2008/04/09 PHP
php 无限级 SelectTree 类
2009/05/19 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
浅谈MySQL中的触发器
2015/05/05 Python
浅谈Python处理PDF的方法
2017/11/10 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
详解django中使用定时任务的方法
2018/09/27 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
python爬取招聘要求等信息实例
2020/11/20 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
40岁生日感言
2014/02/15 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python
Go 内联优化让程序员爱不释手
2022/06/21 Golang