12

抓取大部分内容由看似 ajax 请求生成的动态网站的最佳方法是什么?我以前有过使用 Mechanize、BeautifulSoup 和 python 组合的经验,但我准备尝试一些新的东西。

--编辑--有关更多详细信息:我正在尝试抓取 CNN主数据库。那里有丰富的信息,但似乎没有api。

4

8 回答 8

7

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

于 2008-10-19T07:38:59.830 回答
7

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

这是一个重量级的解决方案,但我看到人们使用greasemonkey 脚本执行此操作——允许Firefox 渲染所有内容并运行javascript,然后抓取元素。如果需要,您甚至可以在页面上启动用户操作。

-亚当

于 2008-10-15T23:09:14.620 回答
4

Selenium IDE 是一种测试工具,我用它来进行大量的屏幕抓取。有一些事情它不能很好地处理(Javascript window.alert() 和一般的弹出窗口),但它通过实际触发点击事件并在文本框中输入来在页面上工作。因为 IDE 部分在 Firefox 中运行,所以您不必进行所有会话管理等,因为 Firefox 会处理它。IDE 记录并回放测试。

它还导出 C#、PHP、Java 等代码以构建在 Selenium 服务器上执行的编译测试/爬虫。我已经为我的多个 Selenium 脚本做到了这一点,这使得将抓取的数据存储在数据库中之类的事情变得更加容易。

脚本的编写和修改相当简单,由 ("clickAndWait","submitButton") 之类的东西组成。考虑到您所描述的内容,值得一看。

于 2008-10-16T01:15:19.467 回答
3

亚当戴维斯的建议是中肯的。

我还建议您尝试“逆向工程”JavaScript 正在做什么,而不是尝试抓取页面,而是发出 JavaScript 发出的 HTTP 请求并自己解释结果(很可能是 JSON 格式,很好且易于解析)。根据 JavaScript 的复杂性,这种策略可能是微不足道的,也可能是彻头彻尾的噩梦。

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

于 2008-10-15T23:34:37.487 回答
2

有一点学习曲线,但是像 Pamie (Python) 或 Watir (Ruby) 这样的工具可以让您进入 IE 网络浏览器并了解这些元素。事实证明,这比 Mechanize 和其他 HTTP 级别的工具更容易,因为您不必模拟浏览器,只需向浏览器询问 html 元素。而且它比逆向工程 Javascript/Ajax 调用要容易得多。如果需要,您还可以将诸如美丽汤之类的工具与 Pamie 结合使用。

于 2008-10-20T21:22:06.033 回答
1

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

于 2008-10-19T08:03:11.200 回答
1

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

于 2009-03-13T10:47:39.907 回答
0

这似乎是一个非常普遍的问题。我想知道为什么没有人开发程序化浏览器?我正在设想一个 Firefox,您可以从命令行使用 URL 作为参数调用它,它将加载页面,运行所有初始页面加载 JS 事件并保存结果文件。

我的意思是 Firefox 和其他浏览器已经这样做了,为什么我们不能简单地剥离 UI 的东西呢?

于 2008-10-16T00:58:10.813 回答