使用Python进行屏幕抓取

Mar*_*rco 14 python screen-scraping pycurl htmlunit

Python是否有提供JavaScript支持的屏幕抓取库?

我一直在使用pycurl来处理简单的HTML请求,而Java的HtmlUnit则用于需要JavaScript支持的更复杂的请求.

理想情况下,我希望能够完成Python的所有工作,但我没有遇到任何允许我这样做的库.它们存在吗?

hoj*_*oju 12

处理静态HTML时有很多选项,其他响应包含这些选项.但是,如果您需要JavaScript支持并希望保留在Python中,我建议使用webkit来呈现网页(包括JavaScript),然后检查生成的HTML.例如:

import sys
import signal
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage

class Render(QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.html = None
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def _finished_loading(self, result):
        self.html = self.mainFrame().toHtml()
        self.app.quit()


if __name__ == '__main__':
    try:
        url = sys.argv[1]
    except IndexError:
        print 'Usage: %s url' % sys.argv[0]
    else:
        javascript_html = Render(url).html
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 11

美丽的汤仍然是你最好的选择.

如果您需要"JavaScript支持"来拦截Ajax请求,那么您也应该使用某种类型的捕获(例如YATT)来监视这些请求是什么,然后模拟/解析它们.

如果您需要"JavaScript支持"以便能够看到具有静态JavaScript的页面的最终结果是什么,那么我的第一选择是尝试根据具体情况弄清楚JavaScript正在做什么(例如,如果JavaScript基于某些Xml做某事,那么只需直接解析Xml)

如果你真的想要"JavaScript支持"(因为你想看看在页面上运行脚本后html是什么)那么我认为你可能需要创建一些浏览器控件的实例,然后阅读生成的html/dom一旦完成加载就从浏览器控件返回并用美丽的汤解析它.那将是我最后的手段.

  • 虽然BeautifulSoup与来自服务器的"静态"HTML标记非常合作,但它会因单页样式的ajaxy web应用程序而失败,这些应用程序通过Javascript和XMLHttpRequests动态生成内容.它也会在依赖Javascript维护会话状态和导航的网站上失败,以防止网页抓取. (2认同)