2010-02-03 14 views
15

Python dispone di librerie di scraping schermo che offrono supporto JavaScript?Scrittura schermo con Python

Sto usando pycurl per semplici richieste HTML e HtmlUnit di Java per le richieste più complesse che richiedono il supporto JavaScript.

Idealmente mi piacerebbe essere in grado di fare tutto da Python, ma non ho incontrato nessuna libreria che mi permettesse di farlo. Esistono?

+4

Un sacco di risposte utili su domande simili qui: http://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Duplicazione esatta: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

non è un duplicato esatto. Questo menziona JavaScript, che richiede strumenti diversi rispetto a quando si lavora con HTML statico. – hoju

risposta

12

Ci sono molte opzioni quando si tratta di HTML statico, che le altre risposte coprono. Tuttavia, se hai bisogno del supporto JavaScript e vuoi rimanere in Python, ti consiglio di usare webkit per eseguire il rendering della pagina web (incluso il JavaScript) e quindi esaminare l'HTML risultante. Ad esempio:

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 - Sto provando a usare questo codice per raschiare un sito web ma non sono sicuro di cosa fare con la variabile 'javascript_html' una volta che è ritornata. 'print javsascript_html' restituisce l'errore' UnicodeEncodeError: 'codec ascii' non può codificare il carattere u '\ u2026' nella posizione 4200: ordinale non nell'intervallo (128) '. per favore aiuto! :) – significance

+0

che è un errore unicode – hoju

+0

Sto provando questo con Python 3, ma l'html renderizzato non ha il suo Javascript elaborato. Ecco il codice: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

Non ho trovato nulla per questo. Uso una combinazione di routine beautifulsoup e personalizzate ...

0

puoi provare 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 non esegue lo screen scrap. – bdd

11

Beautiful soup è ancora probabilmente la soluzione migliore.

Se è necessario "supporto JavaScript" per intercettare le richieste Ajax, è necessario utilizzare anche una sorta di acquisizione (come YATT) per monitorare quali sono tali richieste e quindi emularle/analizzarle.

Se hai bisogno di "supporto JavaScript" per poter vedere quale sia il risultato finale di una pagina con JavaScript statico, allora la mia prima scelta sarebbe cercare di capire cosa sta facendo JavaScript su un case- caso per caso (ad es. se JavaScript sta facendo qualcosa in base ad alcuni Xml, quindi semplicemente analizza direttamente l'Xml)

Se si desidera veramente il "supporto JavaScript" (come in si desidera vedere cos'è l'html dopo gli script sono stati eseguiti su una pagina), quindi penso che sarà probabilmente necessario creare un'istanza di controllo del browser, quindi leggere il risultante html/dom dal controllo del browser una volta terminato il caricamento e analizzarlo normalmente con una bella zuppa. Questa sarebbe la mia ultima risorsa comunque.

+1

Mentre BeautifulSoup funziona magnificamente con il markup HTML 'statico' che viene 'as-is' dal server, fallirà miseramente con applicazioni web ajaxy a pagina singola che generano il loro contenuto dinamicamente tramite Javascript e XMLHttpRequests. Fallirà anche sui siti che si affidano a Javascript per mantenere lo stato della sessione e la navigazione in modo specifico al fine di evitare il web scraping. – ccpizza

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.

Qui si va: http://scrapy.org/

3

Selenium forse? Ti permette di automatizzare un browser reale (Firefox, IE, Safari) usando python (tra le altre lingue). È pensato per testare siti Web, ma sembra che dovrebbe essere utilizzabile anche per scraping. (disclaimer: mai usato da solo)

1

La libreria Webscraping avvolge PyQt4 WebView in un'API semplice e facile da usare.

Ecco un semplice esempio per scaricare una pagina web resa da WebKit ed estrarre l'elemento titolo utilizzando XPath (tratto dal URL sopra):

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