python三种网页抓取方法

通过前面介绍的几篇文章,知道了爬取一个网页很容易了,python爬虫高级功能那一篇,介绍了爬虫的几种反爬虫措施,这里主要介绍三种抓取其中数据的方法。首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块
**1、正则表达式**
如果对正则表达式不熟悉,或是需要一些提示时,可以查阅http://docs.python.org/2/howto/regex.html获得完整介绍
>>> import re
>>> url='http://example.webscraping.com/view/United-Kingdom-239'
>>> html = urllib2.urlopen(url).read()
>>> re.findall('<td class="w2p_fw">(.*?)</td>',html)
['<img src="/places/static/images/flags/gb.png" />', '244,820 square kilometres', '62,348,447', 'GB'
, 'United Kingdom', 'London', '<a href="/continent/EU">EU</a>', '.uk', 'GBP', 'Pound', '44', '@# #@@
|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|(
[A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z
]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', '<div><a href="/iso/IE">IE </a></div>']
虽然现在可以使用这个方案,但是如果网页发生变化,该方案很可能就会失效。比如表格发生了拜年话,去除了第二行中的国土面积数据。如果我们只在现在抓取数据,就可以忽略这种未来可能发生的变化。但是如果我们希望未来还能再次抓取数据,就需要给出更加健壮的解决方案,从而尽可能避免这种布局变化带来的影响。想要该正则表达式更加健壮,我们可以将其父元素<tr>也加入进来。由于该元素具有ID属性,所以应该是唯一的。
这个版本看起来更好一些,但是网页更新还有很多其他方式,同样可以让该正则表达式无法满足。比如,将双引号变为单引号,<td>标签之前加多余空格,或是变更area_label等。
虽然该正则表达式更容易适应未来变化,但又存在难以构造,可读性差的问题。此外,还有一些微笑的布局变化会使该正则表达式无法满足,比如在<td>标签里添加title属性。
从本例中可以看出,正则表达式为我们提供了抓取数据的快捷方式,但是该方式过于脆弱,容易在网页更新后出现问题。型号还有一些更好的解决方案。
**2、BeautifulSoup**
BeautifulSoup是一个非常流行的Python模块。该模块可以解析网页,并提供定位内容的便捷接口。安装其最新版本:
pip install beautifulsoup4
使用BeautifulSoup的第一步是将已下载的HTML内容解析为soup文档。由于大多数网页都不具备良好的HTML格式,因此BeautifulSoup需要对其实际格式进行确定。
**3、Lxml**
Lxml是基于libxml2这一XML解析库的Python封装。该模块使用C语言编写,解析速度比beautifulSoup更快,不过安装过程也更为负责。
**性能对比**
下面直接总结每种抓取方法的优缺点。
抓取方法        性能      使用难度        安装难度

正则表达式 快 困难 简单(内置模块)
BeautifulSoup 慢 简单 简单(纯Python)
Lxml 快 简单 相对困难

如果是你的爬虫瓶颈是下载网页,而不是抽取数据的话,那么使用较慢的方法(如BeautifulSoup)也不成问题。如果只需抓取少量数据,并且想要避免额外依赖的话,那么正则表达式可能更加适合。不过通常情况下,lxml是最好的选择,这是因为该方法既快又健壮,而正则表达式和BeautifulSoup只在某些特定场景下有用。

猜你喜欢

转载自blog.csdn.net/jsqfengbao/article/details/60963489