刮一个动态的网站

时间:2008-10-15 23:04:14

标签: python ajax screen-scraping beautifulsoup

什么是抓住动态网站的最佳方法,其中大部分内容都是由似乎是ajax请求生成的?我以前有过使用Mechanize,BeautifulSoup和python组合的经验,但是我还有新的东西。

- Edit-- 更多细节:我正试图刮掉CNN primary database。那里有大量的信息,但似乎没有api。

9 个答案:

答案 0 :(得分:7)

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

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

- 亚当

答案 1 :(得分:7)

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

答案 2 :(得分:4)

Selenium IDE,一个用于测试的工具,是我用于大量屏幕抓取的东西。它有一些不能很好处理的东西(一般是Javascript window.alert()和弹出窗口),但它通过实际触发点击事件并在文本框中键入来完成页面上的工作。由于IDE部分在Firefox中运行,因此您无需执行所有会话管理等操作,因为Firefox负责处理它。 IDE会记录并回放测试。

它还导出C#,PHP,Java等代码,以构建在Selenium服务器上执行的编译测试/刮刀。我已经为我的一些Selenium脚本做了这些,这使得将删除的数据存储在数据库中变得更加容易。

脚本编写和更改非常简单,由(“clickAndWait”,“submitButton”)之类的东西组成。值得一看你所描述的内容。

答案 3 :(得分:3)

Adam Davis的建议很扎实。

我还建议您尝试“反向工程”JavaScript正在做的事情,而不是试图抓取页面,而是发出JavaScript发出的HTTP请求并自己解释结果(最有可能是JSON格式,很好且易于解析)。根据JavaScript的复杂程度,这种策略可以是从琐碎到完全噩梦的任何事情。

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

答案 4 :(得分:2)

有一点学习曲线,但是像Pamie(Python)或Watir(Ruby)这样的工具可以让你锁定IE浏览器并获取元素。事实证明这比Mechanize和其他HTTP级别工具更容易,因为您不必模拟浏览器,只需向浏览器询问html元素即可。而且它比Javascript / Ajax调用的逆向工程更容易。如果需要,您还可以使用美味汤等工具与Pamie一起使用。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

我遇到的第一个问题:如果没有Javascript,您能否确认网站绝对无效?如果关闭javascript,你会惊讶地发现有多少网站仍然有用。你可能会被引导到一组略有不同的网址。

相关问题