使用Python进行屏幕抓取

14 投票
7 回答
11113 浏览
提问于 2025-04-15 18:49

Python有没有可以抓取网页内容的库,支持JavaScript的?

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

我希望能在Python中完成所有的工作,但我还没有找到可以做到这一点的库。有没有这样的库呢?

7 个回答

4

Scrapy是一个快速的高级网页抓取和爬虫框架,主要用来访问网站并从网页中提取结构化的数据。它可以用于很多不同的目的,比如数据挖掘、监控和自动化测试。

这里是链接: http://scrapy.org/

11

Beautiful Soup 可能是你最好的选择。

如果你需要“JavaScript支持”,是为了拦截 Ajax 请求,那么你应该使用一些捕获工具(比如 YATT)来监控这些请求是什么,然后再模拟或解析它们。

如果你需要“JavaScript支持”,是为了查看静态 JavaScript 页面最终的结果,那么我建议你逐个分析 JavaScript 的作用(例如,如果 JavaScript 是基于某些 Xml 做事情,那就直接解析 Xml 吧)。

如果你真的想要“JavaScript支持”(也就是说,你想看到页面上脚本运行后的 HTML),那么你可能需要创建一个浏览器控制实例,然后在加载完成后从这个浏览器控制中读取结果的 HTML / DOM,再用 Beautiful Soup 正常解析。不过,这种方法我会把它当作最后的选择。

13

处理静态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

撰写回答