2010-02-03 18 views
15

Hat Python Screen Scraping-Bibliotheken, die JavaScript-Unterstützung bieten?Screen Scraping mit Python

Ich habe mit pycurl für einfache HTML-Anfragen und Htmlunit für kompliziertere Anfragen Java erfordert JavaScript-Unterstützung.

Idealerweise würde ich gerne alles von Python aus tun können, aber ich habe keine Bibliotheken gefunden, die mir erlauben würden, das zu tun. Existieren sie?

+4

Viele hilfreiche Antworten auf ähnliche Fragen hier: http://stackoverflow.com/search?q=scraping+python – 3zzy

+1

Genaue Duplikate: http://stackoverflow.com/questions/2081586/web-scraping-with-python –

+0

Nein, kein exaktes Duplikat. Dieser erwähnt JavaScript, das andere Werkzeuge erfordert als bei der Arbeit mit statischem HTML. – hoju

Antwort

12

Es gibt viele Optionen, wenn es mit statischen HTML handelt, die die anderen Antworten decken. Wenn Sie jedoch JavaScript-Unterstützung benötigen und in Python bleiben möchten, empfehle ich die Verwendung von webkit, um die Webseite (einschließlich JavaScript) zu rendern und das resultierende HTML zu untersuchen. Zum Beispiel:

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 - Ich versuche, diesen Code zu verwenden, um eine Website zu scrappen, bin aber nicht sicher, was ich mit der Variablen 'javascript_html' tun soll, sobald sie zurückgegeben wird. 'print javsascript_html' gibt den Fehler 'UnicodeEncodeError:' ascii 'Codec kann das Zeichen u' \ u2026 'an Position 4200 nicht codieren: Ordinal nicht im Bereich (128)'. bitte hilfe! :) – significance

+0

das ist ein Unicode-Fehler – hoju

+0

Ich versuche das mit Python 3, aber das gerenderte HTML hat sein Javascript nicht verarbeitet. Hier ist der Code: [link] (http://pastebin.com/vzX9p7jv) – karmapolice

-2

Ich habe nichts dafür gefunden. Ich verwende eine Kombination aus beautifulsoup und benutzerdefinierten Routinen ...

0

können Sie versuchen 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 scrape nicht. – bdd

11

Beautiful soup ist immer noch wahrscheinlich Ihre beste Wette.

Wenn Sie „JavaScript-Unterstützung“ für die Zwecke des Abfangens Ajax-Anfragen benötigen, dann sollten Sie auch eine Art von Capture verwenden (wie YATT) zu überwachen, was diese Anforderungen sind, und dann emuliert/Parsen sie.

Wenn Sie "JavaScript-Unterstützung" benötigen, um sehen zu können, was das Endergebnis einer Seite mit statischem JavaScript ist, dann wäre meine erste Wahl, herauszufinden, was das JavaScript in einem Fall bewirkt. von Fall zu Fall (zB wenn das JavaScript etwas basierend auf etwas Xml tut, dann einfach das Xml direkt analysieren)

Wenn Sie wirklich wollen "JavaScript-Unterstützung" (wie in Sie wollen sehen, was die HTML nach Skripten ist auf einer Seite ausgeführt wurden), dann denke ich, dass Sie wahrscheinlich eine Instanz eines Browsersteuerelements erstellen müssen und dann das resultierende html/dom aus dem Browsersteuerelement lesen müssen, sobald es fertig geladen ist, und es normalerweise mit einer schönen Suppe analysieren. Das wäre mein letzter Ausweg.

+1

Während BeautifulSoup wunderbar mit 'statischem' HTML-Markup funktioniert, das so wie es ist von dem Server kommt, wird es kläglich mit einseitigen Webseiten-Ajaxy-Web-Apps versagen, die ihren Inhalt dynamisch über Javascript und XMLHttpRequests generieren. Es wird auch auf Websites, die auf Javascript angewiesen sind, fehlschlagen, um den Sitzungsstatus und die Navigation speziell beizubehalten, um Web-Scraping zu verhindern. – 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.

Hier gehen Sie: http://scrapy.org/

3

Selenium vielleicht? Es ermöglicht Ihnen, einen tatsächlichen Browser (Firefox, IE, Safari) mit Python (neben anderen Sprachen) zu automatisieren. Es ist für das Testen von Websites gedacht, scheint aber auch für Scraping geeignet zu sein. (Disclaimer: habe es nie selbst benutzt)

1

Die Webscraping Bibliothek umschließt das PyQt4 WebView in eine einfache und einfach zu bedienende API.

Hier ist ein einfaches Beispiel eine Web-Seite von WebKit und extrahieren Sie das Titelelement mit XPath (aus der URL oben) gemacht herunterladen:

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