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之永远强大的函数
Sep 14 Python
Python中编写ORM框架的入门指引
Apr 29 Python
python中文编码与json中文输出问题详解
Aug 24 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
详解python中的time和datetime的常用方法
Jul 08 Python
python实现静态服务器
Sep 05 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python文字转语音的实例代码分析
Nov 12 Python
pytorch 数据处理:定义自己的数据集合实例
Dec 31 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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中$_POST与php://input的区别实例分析
2015/01/07 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
关于JS管理作用域的问题
2013/04/10 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
原生js轮播特效
2017/05/18 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python复制文件的方法实例详解
2015/05/22 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
点球小游戏python脚本
2018/05/22 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
会计自我鉴定
2013/11/02 职场文书
工厂厂长的职责
2013/12/12 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
canvas实现贪食蛇的实践
2022/02/15 Javascript