【问题标题】:How to Parse Java-script contains[dynamic] on web-page[html] using Python?如何使用 Python 解析网页 [html] 上的 Java 脚本包含 [动态]?
【发布时间】:2011-08-09 22:18:50
【问题描述】:

我正在构建一个蜘蛛,我正在使用 Beautiful soup 来解析特定 URL 的包含。 现在,一些站点正在使用 Java 脚本来显示动态内容,一旦发生某些操作 [单击或时间],就会向用户显示这些内容。 美丽的汤只解析 java-script 标签运行之前的静态包含。 我想要在 java-script 运行后包含。 有没有办法做到这一点?

我可以想到一种方法:获取 url,打开浏览器并运行此 URL 和 java-script 标签。然后把这个url传给Beautiful soup,可以看到包含哪个java-script[dynamic contains]产生了。但是,如果我要抓取数百万个链接,那么这个解决方案就没有用了。如果有一些可用的内置模块可以预先生成 Html 页面的动态包含。

【问题讨论】:

    标签: python web-crawler beautifulsoup


    【解决方案1】:

    从网页中准确解析 Javascript 增强内容的最佳选择是通过浏览器引擎加载页面。幸运的是,有一些方法可以在 Python 中实现自动化。

    我最成功的方法是使用pywebkitgtk project,它允许您在 Python 应用程序中以编程方式创建和控制 Webkit 浏览器引擎的实例。我还使用jswebkit module 来简化页面上下文中 Javascript 的执行。

    另一个选项是PyQt4's QtWebKit class,我只用于实验。

    这是一个使用 pywebkitgtk 和 jswebkit 从 Webkit 渲染页面中提取数据的工作示例。在生产环境中,您需要并行运行多个这样的处理器,每个都渲染到自己的 X virtual framebuffer (Xvfb) 实例。

    import os
    
    import gtk
    import jswebkit
    import lxml.html
    import pygtk
    import webkit
    
    def load_finished(view, frame):
        # called when the document finishes loading
        if frame != view.get_main_frame():
            return
        ctx = jswebkit.JSContext(frame.get_global_context())
        res = ctx.EvaluateScript('window.location.href')
        print res
        res = ctx.EvaluateScript('document.body.innerHTML')
        tree = lxml.html.fromstring(res)
        print tree.xpath('//input[@type="submit"]')
    
    # initialization
    pygtk.require20()
    gtk.gdk.threads_init()
    
    # create the webview and hook up callbacks to signals
    view = webkit.WebView()
    view.set_size_request(1024, 768)
    view.connect('load-finished', load_finished)
    
    # configure the webview
    props = view.get_settings()
    props.set_property('enable-java-applet', False)
    props.set_property('enable-plugins', False)
    props.set_property('enable-page-cache', False)
    
    # create a window to host the webview
    win = gtk.Window()
    win.add(view)
    win.show_all()
    
    # open google front page
    view.open('http://www.google.com')
    
    # spin, processing gtk events
    while True:
        try:
            while gtk.events_pending():
                gtk.main_iteration(False)
        except KeyboardInterrupt:
            break
    

    示例输出:

    http://www.google.com/
    [<InputElement 2a64a78 name='btnG' type='submit'>, <InputElement 2a64bb0 name='btnG' type='submit'>, <InputElement 2a64ae0 name='btnI' type='submit'>]
    

    【讨论】:

    • 感谢 samplebias。事情是,它给了我一个错误,说“无法打开显示”......我已经尝试了设置显示变量或在 python 中使用 -c 选项等所有方法。但是,我遇到了同样的错误。有什么办法吗?
    • 问题源于 gtk/webkit 无法连接到您的 X 显示器以显示浏览器窗口。如果您要 ssh-ing 到服务器,则需要使用 X 并在会话中启用 X11 转发,例如ssh -Y [remote host]。这应该设置 shell $DISPLAY 变量,您可以使用echo $DISPLAY 进行验证
    • 当然,这是jswebkit homepage 的链接和download the jswebkit 0.0.3 source code 的直接链接。我只在 Ubuntu 10.04+ 上使用过这段代码;我没有在 Centos 5.x 下运行的经验。
    • 谢谢伙计。我正在努力,一旦完成,我会通知你。我只是对包 [jswebkit] 感到好奇。它有 .pyx 文件和 .pyi 文件。现在,我计划将这些所有文件放在站点包中。问题是,我需要安装任何与 CPython 相关的东西吗?
    • 我可能无法提供详细的构建信息,因为我个人从未在 Centos 上构建过 Webkit/JavascriptCore 堆栈。我很确定 jswebkit 将需要最新版本的 Cython(如 0.14)来构建。安装 Cython 后,您应该能够使用 python setup.py bdist_rpm 为 jswebkit 构建 RPM。
    猜你喜欢
    • 2014-11-28
    • 2013-07-01
    • 2014-07-05
    • 2013-06-29
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多