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 相关文章推荐
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python实现获取域名所用服务器的真实IP
Oct 25 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
python3使用matplotlib绘制条形图
Mar 25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
python线程的几种创建方式详解
Aug 29 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
Python3 A*寻路算法实现方式
Dec 24 Python
Python list和str互转的实现示例
Nov 16 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
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的图形函数中显示汉字
2006/10/09 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
php之readdir函数用法实例
2014/11/13 PHP
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
Java基础面试题
2014/07/19 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
大学在校生求职信范文
2013/11/21 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
同事打架检讨书
2014/02/04 职场文书
企业员工薪酬方案
2014/06/04 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
初中家长评语和期望
2014/12/26 职场文书
万能检讨书
2015/01/27 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
公历12个月名称的由来
2022/04/12 杂记