2008-10-15 109 views
12

什么是最好的方法来刮动动态网站,其中大部分内容是由似乎是Ajax请求生成的?我以前有过使用Mechanize,BeautifulSoup和python组合的经验,但是我为了一些新的东西而奋斗。刮动态网站

- 编辑 - 欲了解更多详情:我试图刮CNN primary database。这里有大量的信息,但似乎并不是一个API。

回答

7

这是一个难题,因为您必须对每个站点的JavaScript进行反向工程,或者实现一个JavaScript引擎并运行脚本(这有其自身的困难和缺陷)。

这是一个重量级的解决方案,但我看过人们用greasemonkey脚本来做这件事情 - 允许Firefox呈现所有内容并运行javascript,然后刮掉这些元素。如果需要,您甚至可以在页面上启动用户操作。

-Adam

3

亚当戴维斯的建议是坚实的。

我还会建议您尝试对JavaScript进行“反向工程”,而不是尝试刮擦页面,而是发出JavaScript发出的HTTP请求并自行解释结果(很可能以JSON格式,很好并且易于解析)。这个策略可以是从琐碎到完全的噩梦,取决于JavaScript的复杂性。

当然,最好的可能是说服网站的维护人员实施一个开发友好的API。所有酷酷的孩子最近都在这样做)8)当然,他们可能不希望他们的数据以自动化的方式被刮掉......在这种情况下,您可以期待一种让他们的页面越来越难以刮擦的猫捉老鼠游戏:-(

0

这似乎是一个很常见的问题我想知道为什么有人没有人开发一个编程浏览器?我设想一个Firefox,你可以通过命令行调用一个URL作为参数,将加载网页,运行所有的初始页面加载JS事件,并保存生成的文件。

我的意思是Firefox和其他浏览器已经做到这一点,我们为什么不能简单地剥去UI的东西?

+2

人们已经使用webkit完成了此操作,例如:http://blog.motane.lu/2009/07/07/downloading-a-pages-content-with-python-and-webkit/comment-page- 1 – hoju 2010-01-30 14:06:54

4

Se lenium IDE是一款用于测试的工具,我用它进行了大量的屏幕抓取。有几件事处理不好(Javascript window.alert()和一般的弹出窗口),但它通过实际触发点击事件并在文本框中输入来在页面上工作。由于IDE部分在Firefox中运行,因此在Firefox处理它时,您不必执行所有会话管理等。 IDE记录并播放测试。它还导出C#,PHP,Java等代码来构建在Selenium服务器上执行的编译测试/刮板。我已经为我的Selenium脚本中的一些脚本完成了这些工作,这使得将碎片数据存储在数据库中变得更容易。

脚本编写和修改相当简单,由诸如(“clickAndWait”,“submitButton”)组成。值得一看你给出的描述。

7

我发现的最佳解决方案是使用Firebug监视XmlHttpRequests,然后使用脚本重新发送它们。

1

可能最简单的方法是在C#(或任何其他语言)中使用IE浏览器控件。您可以访问开箱即用的所有内容+您不需要关心cookie,SSL等等。

2

有一点学习曲线,但像Pamie(Python)或Watir(Ruby)这样的工具可以让你锁定IE浏览器并浏览元素。这比Mechanize和其他HTTP级别的工具更简单,因为您不必模拟浏览器,只需向浏览器请求html元素即可。这将比反编译JavaScript/Ajax调用更容易。如果需要,你还可以使用美容汤等工具与Pamie结合使用。

1

我发现IE Webbrowser控件有各种各样的怪癖和变通方法,可以证明一些高质量的软件能够处理所有这些不一致的情况,分层围绕shvwdoc.dll api和mshtml并提供一个框架。

0

我有第一个问题:你能否确认该网站绝对没有Javascript没有工作?如果关闭javascript,您会惊讶有多少网站仍然可用。你可能会被引导到一个稍微不同的网址集。