抓取动态网站

Posted

技术标签:

【中文标题】抓取动态网站【英文标题】:Scrape a dynamic website 【发布时间】:2010-09-17 10:29:28 【问题描述】:

在大部分内容由看似 ajax 请求生成的动态网站上,最好的方法是什么?我之前有过使用 Mechanize、BeautifulSoup 和 python 组合的经验,但我正在尝试新的东西。

--编辑-- 有关更多详细信息:我正在尝试抓取 CNN primary database。里面有很多资料,但是好像没有api。

【问题讨论】:

【参考方案1】:

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

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

-亚当

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

人们已经用 webkit 做到了这一点,例如这里:blog.motane.lu/2009/07/07/…【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于抓取动态网站的主要内容,如果未能解决你的问题,请参考以下文章

网页抓取具有动态 javascript 内容的网站

抓取网站时动态 JS 生成代码

使用 Selenium 和 Python 进行用户输入的网页抓取动态网站

scrapy-splash抓取动态数据例子二

scrapy-splash抓取动态数据例子五

以小饭桌网站为例介绍抓取动态网页的数据python爬虫入门进阶(12)