2010-02-03 120 views
15

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

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

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

+4

很多在这里类似的问题有帮助的答案是:http:/ /stackoverflow.com/search?q=scraping+python – 3zzy 2010-02-03 08:21:44

+1

精确重复:http://stackoverflow.com/questions/2081586/web-scraping-with-python – 2010-02-03 11:06:52

+0

没有一个确切的副本。这个提到JavaScript,与使用静态HTML相比,它需要不同的工具。 – hoju 2010-02-07 21:09:33

回答

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 
+0

Plumo - 我试图使用这段代码来抓取一个网站,但我不知道如何处理返回的'javascript_html'变量。 'print javsascript_html'返回错误'UnicodeEncodeError:'ascii'编解码器不能在位置4200编码字符u'\ u2026':序号不在范围(128)'中。请帮忙! :) – significance 2010-11-15 17:30:55

+0

这是一个Unicode错误 – hoju 2010-11-16 07:43:00

+0

我想这与Python 3,但呈现的HTML没有处理它的Javascript。代码如下:[link](http://pastebin.com/vzX9p7jv) – karmapolice 2015-06-01 15:34:37

-2

我还没有发现任何东西。我使用美丽和自定义例程的组合...

0

你可以尝试spidermonkey

This Python module allows for the implementation of Javascript? classes, objects and functions in Python, as well as the evaluation and calling of Javascript scripts and functions. It borrows heavily from Claes Jacobssen's Javascript Perl module, which in turn is based on Mozilla's PerlConnect Perl binding.

+0

Spidermonkey不会刮屏幕。 – bdd 2010-12-14 17:53:55

11

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

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

如果您需要“JavaScript支持”以便能够看到静态JavaScript页面的最终结果是什么,那么我的第一选择是试图找出JavaScript在案例研究中所做的工作, (例如,如果JavaScript正在做一些基于某些Xml的东西,那么就直接解析Xml)

如果你真的想要“JavaScript支持”(就像你希望看到脚本后面是什么html一样那么我认为您可能需要创建一个浏览器控件的实例,然后在浏览器控件完成加载并通常用美丽的汤进行解析时,从浏览器控件中读取生成的html/dom。那将是我的最后一招。

+1

虽然BeautifulSoup与来自服务器的'静态'HTML标记一起工作得非常漂亮,但它使用单页风格的ajaxy web应用程序通过Javascript和XMLHttpRequests动态生成其内容时会失败。在依靠Javascript维护会话状态和导航的网站上,它也会失败,以防止网络抓取。 – ccpizza 2013-04-17 21:06:05

4

Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing.

在这里你去:http://scrapy.org/

3

Selenium也许?它允许您使用python(其他语言)自动化实际的浏览器(Firefox,IE,Safari)。这是为了测试网站,但似乎它应该可用于刮。 (免责声明:自己从未使用过)

1

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

下面是一个简单的例子来下载由WebKit的渲染一个网页,并提取使用XPath标题元素(从网址采取以上):

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