HTML 抓取¶

Web抓取¶
Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式,如 CSV 或者 JSON 提供它们的数据。
这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据进行收集并整理成所需格式,同时保存其结构的实践。
lxml和Requests¶
lxml 是一个优美的扩展库,用来快速解析XML以及HTML文档即使所处理的标签非常混乱。我们也将使用Requests模块取代内建的urllib2模块,因为其速度更快而且可读性更好。您可以通过使用pipinstalllxml
与pipinstallrequests
命令来安装这两个模块。
让我们以下面的导入开始:
fromlxmlimporthtmlimportrequests
下一步我们将使用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:
<divtitle="buyer-name">Carson Busses</div><spanclass="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: ',buyersprint'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分析它,或者我们可以将之保存为一个文件并向世界分享。
我们可以考虑一些更酷的想法:修改这个脚本来遍历该例数据集中剩余的页面,或者使用多线程重写这个应用从而提升它的速度。