使用requests和lxml进行web抓取

web抓取

web站点是由HTML语言编写,这意味着每个网页都是结构化文档。有时,我们可利用当前结构获取所需数据并保留数据格式,但通常都不能以合适的结构获取数据(不像csv和json)。

web抓取适时而出。web抓取可利用计算机程序过滤网页,在合适的结构下获取目标数据,同时还可以保留数据的格式。

lxml和Requests

lxml是一个优秀的python扩展库,用于快速解析XML和HTML文档,甚至可以处理错误标签。另外,我们也使用Requests替代了内置的urllib2,因为其在速度和稳定性上更优。你可以使用pip install lxmlpip install requests安装requestspip

首先,让我们用import开始:

from lxml import html

import requests

其次,我们用requests.get找到网页,使用lxmlhtml库解析网页,并将结果保存在tree中:

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)

tree现在已经以整齐的树形结构包含了所有的HTML内容。我们可以通过XPath和CSSSelect两种方式来获取树形结构中的数据,在本篇文章中,我们使用前者。

XPath是一种在结构化文档中定位信息的方法,比如在HTML和XML文档中。关于XPath的介绍请参考W3Schools

获取元素的XPath有很多工具,比如Firefox中的FireBug,Chrome的开发者工具。如果你使用的Chrome,你可以在元素上点击右键,选择“审查元素”,在HTML查看器中高亮这段HTML代码,再次点击右键并选择“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地址检索并使用lxmlxpath功能,代码如下:

#这将获取到一个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']

恭喜你!我们已经使用lxmlResquests从网页中抓取到了所需的数据。我们将数据作为列表保存在内存中。现在我们可以做各种有趣的事情了:我们可以用python分析数据,或者可以保存为文件并分享出去。

还有更有趣的事情可考虑,比如修改脚本使其能够遍历示例网页中所有页面数据,或者使用多线程重写这个应用以提高其速度。

备注

  1. 关于XPath的介绍,因为w3schools.com无法访问,故改为了w3schools.com.cn的对应地址。
  2. 本文是翻译The Hitchhiker’s Guide to Python!中的HTML Scraping篇。整个教程都很赞,适合新老手学习。
版权声明:本文内容以盗版加工为主,原创为辅,意在分享,收藏,记录工作中的点点滴滴。不代表任何组织,不代表任何商业机构,也不代表我个人所有想法。
心晴客栈 » 使用requests和lxml进行web抓取

发表回复