2010-02-03 121 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')