14

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

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

理想情况下,我希望能够用 Python 做所有事情,但我还没有遇到任何允许我这样做的库。它们存在吗?

4

7 回答 7

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
于 2010-02-06T23:08:19.667 回答
11

美丽的汤可能仍然是你最好的选择。

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

如果您需要“JavaScript 支持”以便能够查看使用静态 JavaScript 的页面的最终结果是什么,那么我的第一选择是尝试逐个确定 JavaScript 在做什么(例如,如果 JavaScript 正在基于某些 Xml 做某事,那么只需直接解析 Xml)

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

于 2010-02-03T08:38:18.663 回答
4

Scrapy 是一个快速的高级屏幕抓取和网络抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于广泛的用途,从数据挖掘到监控和自动化测试。

给你:http ://scrapy.org/

于 2010-02-03T09:21:32.007 回答
3

可能吗?它允许您使用 python(以及其他语言)自动化实际的浏览器(Firefox、IE、Safari)。它用于测试网站,但似乎也可以用于抓取。(免责声明:我自己从未使用过)

于 2011-09-16T07:47:27.527 回答
1

Webscraping库将 PyQt4 WebView包装成一个简单易用的 API。

这是一个下载 WebKit 呈现的网页并使用 XPath 提取标题元素的简单示例(取自上面的 URL):

from webscraping import download, xpath
D = download.Download()
# download and cache the Google Code webpage
html = D.get('http://code.google.com/p/webscraping')
# use xpath to extract the project title
print xpath.get(html, '//div[@id="pname"]/a/span')
于 2013-04-17T21:55:00.540 回答
-1

你可以试试蜘蛛猴吗?

这个 Python 模块允许执行 Javascript 吗?Python 中的类、对象和函数,以及 Javascript 脚本和函数的评估和调用。它大量借鉴了 Claes Jacobssen 的 Javascript Perl 模块,而后者又基于 Mozilla 的 PerlConnect Perl 绑定。

于 2010-02-03T08:21:37.050 回答
-2

我还没有找到任何东西。我使用了beautifulsoup和自定义例程的组合......

于 2010-02-03T08:14:48.750 回答