2010-01-27 11 views
16

Ich muss eine Seite mit Python zu kratzen. Ich erhalte den Quell-HTML-Code mit dem Urlib-Modul, aber ich muss auch etwas HTML-Code scrappen, der von einer JavaScript-Funktion erzeugt wird (die in der HTML-Quelle enthalten ist). Was diese Funktion tut, ist "in" der Site, dass wenn Sie eine Taste drücken, gibt es etwas HTML-Code aus. Wie kann ich diesen Knopf mit Python-Code "drücken"? Kann mir scrapy helfen? Ich habe die POST-Anfrage mit Firebug erfasst, aber wenn ich versuche, sie auf der URL zu übergeben, erhalte ich einen 403-Fehler. Irgendwelche Vorschläge?scrape HTML generiert von Javascript mit Python

+2

Verschlissene verschleierte Adressen aus Webseiten für Mail-Listen? –

+0

Ich beantwortete eine ähnliche Frage auf [Klicken Sie auf einen Javascript-Link in Python?] (Http://stackoverflow.com/questions/5207948/click-on-a-javascript-link-within-python/5227031#5227031) –

Antwort

10

In Python glaube ich Selenium 1.0 ist der Weg zu gehen. Es ist eine Bibliothek, mit der Sie einen echten Webbrowser in Ihrer Sprache steuern können.

Sie müssen den fraglichen Webbrowser auf dem Computer installiert haben, auf dem Ihr Skript ausgeführt wird, aber es scheint die zuverlässigste Methode zu sein, Websites mit viel JavaScript programmatisch abzufragen.

+0

ist gibt es einen Weg, um es mit Anfragen und schöne Suppe selbst zu tun? Ich habe Anfragen verwendet und es funktioniert gut in jedem anderen Fall, aber dies. Bitte lassen Sie mich wissen, wenn Anfragen dieses Ding auch lösen können. – Shaardool

+0

@Shaardool: was zu lösen? Scraping HTML, das im Browser von JavaScript generiert wird? Nein - dafür benötigen Sie etwas, das das JavaScript ausführt, damit es das HTML erzeugen kann. Beautiful Soup lässt kein JavaScript laufen. –

+0

danke für den Einblick, kann Requests-Bibliothek es tun?Es funktioniert gut mit AJAX-Anfragen an Server, aber ich möchte wissen, ob es mit Javascript, das auch HTML erstellt, arbeiten kann. Ich habe jedoch in ihren Unterlagen nichts dergleichen gefunden. – Shaardool

4

Ich musste dies vorher tun (in. NET) und Sie müssen im Grunde einen Browser hosten, um es auf die Schaltfläche klicken, und dann das DOM (Dokumentobjektmodell) des Browsers abfragen zu bekommen am generierten HTML.

Dies ist definitiv einer der Nachteile von Web-Apps, die sich auf einen Ajax/Javascript-Ansatz zum Generieren von HTML-Client-Seite hin bewegen.

2

Für Scrapy (große Python Scraping-Framework) gibt es scrapyjs: eine zusätzliche Downloader-Handler/Middleware-Handler in der Lage, javascript-generierten Inhalt scraping.

Es basiert auf Webkit-Engine von Pygtk, Python-Webkit und Python-Jswebkit und es ist ziemlich einfach.

6

Da gibt es keine umfassende Antwort hier, ich werde weitermachen und einen schreiben.

abkratzen JS gerenderten Seiten, werden wir einen Browser benötigen, die eine JavaScript-Engine (ei, der JavaScript unterstützt Rendering)

Optionen wie Mechanize, url2lib wird nicht funktionieren, da sie nicht hat DO unterstütze JavaScript.

Also hier ist was Sie tun:

Setup-PhantomJS mit Selenium auszuführen. Nach der Installation der Abhängigkeiten für beide (siehe this) können Sie den folgenden Code als Beispiel verwenden, um die vollständig gerenderte Website abzurufen.

from selenium import webdriver 

driver = webdriver.PhantomJS() 
driver.get('http://jokes.cc.com/') 
soupFromJokesCC = BeautifulSoup(driver.page_source) #page_source fetches page after rendering is complete 
driver.save_screenshot('screen.png') # save a screenshot to disk 

driver.quit()