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中readline判断文件读取结束的方法
Nov 08 Python
Python中的异常处理学习笔记
Jan 28 Python
Python字符串和文件操作常用函数分析
Apr 08 Python
python生成lmdb格式的文件实例
Nov 08 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
django基于restframework的CBV封装详解
Aug 08 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Python random库使用方法及异常处理方案
Mar 02 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
Python实现给PDF添加水印的方法
Jan 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
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
python简单文本处理的方法
2015/07/10 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
Python 如何定义匿名或内联函数
2020/08/01 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
施惠特软件测试面试题以及笔试题
2015/05/13 面试题
机电一体化专业推荐信
2013/12/03 职场文书
可口可乐广告词
2014/03/20 职场文书
匿名检举信范文
2015/03/02 职场文书
教师病假条范文
2015/08/17 职场文书
七年级数学教学反思
2016/02/17 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Python利用capstone实现反汇编
2022/04/06 Python