HTML 抓取
网页爬取
编写网页需要使用 HTML 语言,如果你有 HTML 学习经历就能知道所谓 HTML 语言就是一种规格化文档。有时我们能很方便的从中获取一些需要的数据,并且保持数据原有格式,如 csv
、json
等格式。但有时网站并不会提供一目了然的数据格式。
所以我们就需要爬取网页。网页爬取就是通过电脑程序编写,从不同的网页中去删选、挖掘你需要的数据,并且保存数据相应的格式。
网页请求( Requests )和解析( lxml )
lxml 模块是能快速高效地解析 XML 和 HTML 文档的第三方包,甚至在解析网页过程中对一些错误使用的标签( tags )也能很好的处理。其次,由于 Python 相关的库较多且更新速度快,对于原有的 urllib2 模块( python3 版本不再支持 urllib2 ,而是用 urllib 代替),我们将使用可读性能更优的 Requests 模块代替。通过如下命令你能很方便的安装这两个模块 pip install lxml
和 pip install requests
。
导入这些模块,来开启 coding 之旅吧:
from lxml import html
import requests
接下来我们使用 requests.get
,用我们的数据(如网址 url )来请求网页,然后使用 html
模块来解析它,并保存在 tree
中。
page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)
(这里我们需要使用 page.content
而不是 page.text
,因为使用 html.fromstring
意味着只接受 bytes
格式数据。)
tree
现在保存了整个 HTML 文档,有着简洁明了的树形结构,以便我们可以通过两种不同的方式: XPath 和 CSS 来解析它。在这个例子中,我们将重点关注前者。
XPath 是一种在类似 HTML 、 XML 等结构化文档中定位信息的方法。你可以在此 W3Schools 深入了解 XPath 。
现在有很多工具可以帮助获取 XPath 的元素( elements ),比如火狐浏览器的 FireBug (译者注:新版浏览器没有该插件,审查元素即可) 和谷歌浏览器的 Chrome Inspector 。如果你使用谷歌浏览器,你可以对你想要获取的元素鼠标右键,选择 Inspect element
,对高亮标注的代码,再次右键,然后选择 Copy XPath
。
在短暂分析后,我们能发现我们要在网页中寻找的数据包含在两个元素中 —— 一个是含有 title
属性是 buyer-name
的 div 标签,另一个是class
属性是item-price
的 span 标签:
Carson Busses
$29.95
知道这些后,我们能正确地使用 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 和 Requests 模块从网页中爬取了我们想要的是数据,并用列表把它们存储起来了。现在我们可以用这些数据做一些很酷的事了,比如使用 Python 对它们进行数据分析,或保存在文件中并分享在互联网上。
你也可以思考一些更酷的想法,比如如何编写一个脚本对其余页面类似数据集进行爬取,或者尝试使用多线程重写这段代码来提高运行速度。
如果你想学习如何使用 Python 导入数据 —— 这里 DataCamp course on Importing Data 是一个不错的开始