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

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

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

【问题讨论】:

    标签: python ajax screen-scraping beautifulsoup


    【解决方案1】:

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

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

    -亚当

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        【解决方案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 分层并提供一个框架。

                【讨论】:

                  猜你喜欢
                  • 2020-10-02
                  • 2018-11-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-25
                  • 2019-09-29
                  相关资源
                  最近更新 更多