工作中经常与数据打交道,去网上抓取数据也成了家常便饭。以前就准备抽空总结下的。
最近刚好看到 http://segmentfault.com/q/1010000000124036 上这篇文章有人问到了,
而且下面有热心pythoner 已经回答了,特此整理下,以备忘。
问题:现在要抓取一批页面,并将指定标签里面的数据抓取出来,如何做到通用性好,稳定可用?
1、使用第三方库:mechanize
import mechanize import cookielib if __name__=='__main__': br = mechanize.Browser() br.set_cookiejar(cookielib.LWPCookieJar()) # Cookie jar br.set_handle_equiv(True) # Browser Option br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] br.open("http://apple.com") print br.title()
输出为Apple
对于mechanize的详细使用,参考 http://my.oschina.net/leejun2005/blog/83451
2、使用第三方库: Beautiful Soup 扩展包来解析
import urllib from bs4 import BeautifulSoup content = urllib.urlopen('http://www.apple.com/').read() soup = BeautifulSoup(content) print soup.find('title').string
输出为Apple
对于Beautiful Soup的详细使用,参考 http://www.crummy.com/software/BeautifulSoup/bs4/doc/
Python爬虫入门(8):Beautiful Soup的用法 http://python.jobbole.com/81349/
3、使用第三方库: lxml 扩展包来解析
from lxml import html doc = html.parse('http://www.apple.com/') title = doc.find('.//title').text print title
4、可以使用第三方库: pyquery (经常与 lxml 结合使用)
from pyquery import PyQuery as pq d = pq(url='http://apple.com') print 'Title: ', d('title').text()
5、直接使用正则来解析:
import urllib import re url='http://apple.com' html = urllib.urlopen(url).read() m = re.findall(r"<title>(.*)</title>", html) print m[0]
输出为Apple
有关python正则的使用请见《Python正则表达式操作指南》
http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97
注:
以上几种方法中,推荐优先使用前 4 种,或者有其它优秀的第三方库你也可以尝试。
之所以不推荐最后的正则解析原因有2:
(1)HTML存在一些标签不规范的场景,如<p>, <BR>, 等可以单独出现,不用配对出现,
你可以简单的认为他的语法非常灵活,不像 xml 那样限制的很严格,之所以浏览器能解析是因为
浏览器背后做了许多不为人知的解析工作,如果你要用正则来做,你也需要考虑很多情况,
而且通用性也会大打折扣。这也是建议你选择第三方库的主要原因。
(2)直接用正则这么解析,在面对复杂的抓取的时候,正则的性能会是严重的瓶颈。
REF:
Python网页解析:BeautifulSoup vs lxml.html
http://my.oschina.net/apoptosis/blog/118647
6、在 java 中你可以使用 jsoup 来方便的解析 html 标签:
使用 jsoup 对 HTML 文档进行解析和操作
http://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/
http://jsoup.org/cookbook/extracting-data/example-list-links
https://github.com/code4craft/jsoup-learning jsoup-learning
public static void parseHtmlTag(String html) throws IOException { // Document doc = Jsoup.parse(html); Document doc = Jsoup.connect("http://www.hao123.com").get(); Elements links = doc.select("a[href]"); for (Element link : links) { System.out.println(link.attr("abs:href") + "\t" + link.text()); } }
http://www.hao123.com# 不再提醒 http://go.client.baidu.com/?linkid=211 http://www.hao123.com 设为主页 http://www.hao123.com/redian/tongzhi.htm 主页修复 ...