如何构建一个能从任何网站提取特定信息的网络爬虫?
我正在尝试建立一个网络爬虫,想要在任何评论网站上都能比较可靠地抓取用户评论。也就是说,我不想为像亚马逊和Overstock这样的特定网站分别写一个爬虫,而是想要一个可以同时抓取这两个网站上产品评论的爬虫,哪怕准确性稍微牺牲一点。之前我和我的一位教授聊过,他提到我可以简单地使用一些启发式的方法来收集数据(比如说,直接抓取所有
标签中的文本)。现在,我主要是想要一些建议,看看该往哪个方向发展。
(如果这有帮助的话,目前我在使用Python的mechanize和lxml来爬取各个网站。)
谢谢!
3 个回答
有一个关于评论的RDF词汇,还有一个微格式。如果你的评论使用这些格式,就会很容易被解析。
在1993年左右,我写了一个爬虫程序,用来从不同的网站提取特定内容。这个程序是根据每个网站定义的一系列“规则”来工作的。
这些规则用一种叫做正则表达式的东西来表示,分为两类:一种是“准备”规则(这些规则会处理获取到的页面,以便更好地识别和提取数据),另一种是“提取”规则(这些规则会直接提取有用的数据)。
举个例子,假设我们有这样一个页面:
<html>
<head><title>A Page</title></head>
<body>
<!-- Other stuff here -->
<div class="main">
<ul>
<li>Datum 1</li>
<li>Datum 2</li>
</ul>
</div>
<!-- Other stuff here -->
<div>
<ul>
<li>Extraneous 1</li>
<li>Extraneous 2</li>
</ul>
</div>
<!-- Other stuff here -->
</body>
</html>
为了提取页面中的“Datum”值,我们可能会用到以下规则:
- 用
'^.*?<div class="main">'
去掉开头的部分 - 用
'</div>.+</html>$'
去掉结尾的部分 - 用
'<li>([^<]+)</li>'
提取出结果
这个方法在大多数网站上都能很好地工作,直到他们改变了页面布局,这时候就需要调整针对那个网站的规则了。
现在的话,我可能会使用Dave Raggett的HTMLTidy来把所有获取到的页面转换成合法的XHTML格式,然后用XPATH/XSLT来处理页面,使其符合正确的格式。
这个问题其实没有一个明确的“答案”,但为了帮助那些看到这个问题的人,下面是一些信息:
所谓的“通用”抓取工具,最多也就是个有趣的学术练习。实际上,它很可能无法以任何有用的方式实现。
有两个比较有用的项目可以参考,一个是Scrapy,这是一个用Python写的网页抓取框架;另一个是http://www.nltk.org/,也就是自然语言工具包,它包含了很多与处理自然语言文本相关的Python模块。