使用 Python 进行屏幕抓取

Posted

技术标签:

【中文标题】使用 Python 进行屏幕抓取【英文标题】:Screen scraping with Python 【发布时间】:2011-01-12 12:39:28 【问题描述】:

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

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

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

【问题讨论】:

这里有很多关于类似问题的有用答案:***.com/search?q=scraping+python 完全重复:***.com/questions/2081586/web-scraping-with-python 不是完全重复。这里提到了 JavaScript,它需要与使用静态 HTML 时不同的工具。 【参考方案1】:

在处理静态 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 javsascript_html 返回错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 4200: ordinal not in range(128)。请帮忙! :) 我正在尝试使用 Python 3,但呈现的 html 没有处理其 Javascript。这是代码:link 这是用 Python 2 测试的,Python 3 几乎肯定需要一些改变【参考方案2】:

Beautiful soup 可能仍然是您的最佳选择。

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

如果您需要“JavaScript 支持”以便能够查看使用静态 JavaScript 的页面的最终结果是什么,那么我的第一选择是尝试找出 JavaScript 在个案中的作用-case based (eg if JavaScript is doing something based on some Xml,然后直接解析Xml)

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

【讨论】:

虽然 BeautifulSoup 与来自服务器的as-is 的“静态”HTML 标记完美配合,但对于通过 Javascript 和 XMLHttpRequests 动态生成其内容的单页样式 ajaxy Web 应用程序,它会惨遭失败。在依赖 Javascript 来维护会话状态和导航以防止网络抓取的网站上,它也会失败。【参考方案3】:

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

给你:http://scrapy.org/

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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')

【讨论】:

【参考方案6】:

你可以试试spidermonkey?

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

【讨论】:

Spidermonkey 不会刮屏。【参考方案7】:

我没有为此找到任何东西。我结合使用 beautifulsoup 和自定义例程...

【讨论】:

以上是关于使用 Python 进行屏幕抓取的主要内容,如果未能解决你的问题,请参考以下文章

使用javascript屏幕延迟抓取网站[关闭]

屏幕抓取 Python 中基于 Javascript 的网页

使用 Python3 Pytesseract 进行实时屏幕监控

初学者通过 Python 学习屏幕抓取的最佳方式 [关闭]

使用 HttpWebRequest.GetResponse() 进行屏幕抓取时出现错误“远程服务器返回错误:(403) Forbidden”

如何使用 Python 中的 subprocess 模块启动和停止 Linux 程序?