使用Python进行屏幕抓取

14

Python有支持JavaScript的屏幕抓取库吗?

我使用pycurl进行简单的HTML请求,使用Java的HtmlUnit进行需要JavaScript支持的更复杂的请求。

理想情况下,我希望能够从Python中完成所有操作,但我还没有找到任何可以让我实现这一点的库。它们存在吗?


4
这里有许多关于类似问题的有用答案:http://stackoverflow.com/search?q=scraping+python - eozzy
1
完全重复:https://dev59.com/3HI95IYBdhLWcg3w8iz1 - S.Lott
1
这里提到了 JavaScript,它需要不同于静态 HTML 的工具。 - hoju
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

Plumo - 我正在尝试使用这段代码来爬取一个网站,但是我不确定一旦返回了'javascript_html'变量后该怎么办。print javascript_html会返回错误信息UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 4200: ordinal not in range(128)。请帮忙解决! :) - significance
我正在尝试使用Python 3进行操作,但是呈现的HTML没有经过JavaScript处理。这是代码:链接 - karmapolice
这是使用Python 2测试过的,Python 3几乎肯定需要进行一些更改。 - hoju

11

BeautifulSoup仍然是您最好的选择。

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

如果您需要“JavaScript支持”以便能够查看具有静态JavaScript的页面的最终结果,那么我的首选是逐个案例地尝试弄清楚JavaScript正在做什么(例如,如果JavaScript基于某些Xml执行某些操作,则直接解析Xml而不是JavaScript)。

如果您真的需要“JavaScript支持”(即您想要查看在页面上运行脚本后的html),那么我认为您可能需要创建某个浏览器控件的实例,然后在浏览器控件完成加载后从中读取生成的html / dom,并使用beautifulsoup正常解析。但这将是我的最后一步尝试。


2
虽然BeautifulSoup在处理从服务器“原样”传输的“静态”HTML标记时表现出色,但它在生成内容动态通过Javascript和XMLHttpRequests的单页式ajax Web应用程序上将会失败。它也无法处理依赖于Javascript来维护会话状态和导航的网站,以特定方式防止网络爬取。 - ccpizza

4
Scrapy是一个快速高级的屏幕抓取和网络爬虫框架,用于爬取网站并从其页面中提取结构化数据。它可以用于广泛的目的,从数据挖掘到监测和自动化测试。
这里是链接:http://scrapy.org/

3

Selenium也许是一个不错的选择?它允许你使用Python(以及其他语言)自动化实际浏览器(Firefox,IE,Safari)。它主要用于测试网站,但似乎也可以用于网页抓取。(免责声明:我自己从未使用过它)


1

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

这里有一个简单的示例,使用XPath下载由WebKit渲染的网页并提取其中的标题元素(取自上述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')

-1

你可以尝试使用spidermonkey吗?

这个Python模块允许在Python中实现JavaScript类、对象和函数,以及评估和调用JavaScript脚本和函数。它很大程度上借鉴了Claes Jacobssen的JavaScript Perl模块,而Claes Jacobssen的JavaScript Perl模块则基于Mozilla的PerlConnect Perl绑定。


1
Spidermonkey不进行屏幕抓取。 - bdd

-2

我还没有找到相关的内容。我使用beautifulsoup和自定义程序的组合...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接