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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
跟老齐学Python之不要红头文件(1)
Sep 28 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
Apr 16 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
python删除文件、清空目录的实现方法
Sep 23 Python
Python中的面向接口编程示例详解
Jan 17 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 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
php如何连接sql server
2015/10/16 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
javascript 动态添加表格行
2006/06/22 Javascript
IE中jscript/javascript的条件编译
2006/09/07 Javascript
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
关于python的list相关知识(推荐)
2017/08/30 Python
在双python下设置python3为默认的方法
2018/10/31 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
旅游个人求职信范文
2014/01/30 职场文书
火锅店营销方案
2014/02/26 职场文书
高三家长寄语
2014/04/03 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
公司承诺书范文
2014/05/19 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
SQL注入详解及防范方法
2021/12/06 MySQL
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫