Heim  >  Artikel  >  Backend-Entwicklung  >  Scrapy benutzerdefinierter Crawler-Crawler-Javascript-Inhalt

Scrapy benutzerdefinierter Crawler-Crawler-Javascript-Inhalt

高洛峰
高洛峰Original
2016-10-17 13:57:561267Durchsuche

Viele Websites verwenden Javascript ... Webseiteninhalte werden dynamisch von js generiert, und einige js-Ereignisse lösen Seiteninhaltsänderungen und das Öffnen von Links aus. Sogar einige Websites funktionieren ohne js überhaupt nicht und geben stattdessen eine ähnliche Nachricht zurück zu „Bitte Browser-JS öffnen“ und dergleichen.

Es gibt vier Lösungen zur Unterstützung von Javascript:
1. Rufen Sie einen Browser mit einer Schnittstelle auf. Ähnlich wie Selenium, das häufig zum Testen verwendet wird
3, verwenden Sie einen schnittstellenlosen Browser, verschiedene Webkit-basierte, CasperJS, PhantomJS usw.
4, kombinieren Sie es mit einer JS-Ausführungs-Engine. Es ist sehr schwierig zu implementieren Ein leichter Browser für Sie.

Wenn Sie bei einfachen, begrenzten Crawling-Aufgaben die JS-Logik durch Code simulieren können, wird diese Lösung bevorzugt. In der Suchmaschine duckduckgo wird beispielsweise die Aktion der Seite ausgelöst js. Es scheint schwierig zu sein, das zweite Formular auf seiner Seite zu simulieren. Ich habe es versucht und es war wahr Logik: Versuchen Sie zunächst, das JS des Browsers zu schließen, um zu sehen, ob Sie die Kompatibilität ohne JS erhalten. Wenn dies nicht funktioniert, öffnen Sie die Chrome-Konsole oder den Firebug, um die JS-Logik zu beobachten. B. Senden und Empfangen. Sie können urllib2 (empfohlene Anforderungsbibliothek) zum Simulieren verwenden oder dom oder ähnliches ändern und lxml verwenden, um es entsprechend zu ändern. Mit anderen Worten, wenn js etwas ausführt, verwenden Sie Python-Code zum Simulieren


Sie können sich auch für die Verwendung von Selen entscheiden. Der Nachteil besteht darin, dass die Effizienz zunächst für Sie akzeptabel ist In der zweiten Ebene ist das Rendern der Seite noch langsamer. Unter der Voraussetzung, dass die Effizienz akzeptabel ist, ist diese Lösung nicht schlecht In einer Desktop-Umgebung kann Selenium nicht visuell ausgeführt werden. Es ist nicht klein, es ist nicht möglich, JS zu simulieren, Selenium ist zu ineffizient oder es muss in einer Nicht-Desktop-Umgebung ausgeführt werden Die allgemeine Situation mehrerer schnittstellenloser Browser ist wie folgt:

1, casperjs, phantomjs: nicht py, kann über die Befehlszeile aufgerufen werden, und die Funktionen sind grundsätzlich erfüllt Zuerst zufrieden. Phantomjs verfügt auch über eine inoffizielle Webdriver-Protokollimplementierung, sodass Phantomjs keine Schnittstelle erreichen kann. 2. Ghost, Spynner usw. Ich persönlich denke Der Spynner-Code ist chaotisch und der Geistercode ist von guter Qualität. Ich habe selbst einen geändert, nachdem ich mir mehrere solcher Bibliotheken angesehen habe.


Schließlich gibt es einen Eine weitere Option: Basierend auf der js-Ausführungs-Engine können Sie einen einfachen, schnittstellenlosen Browser implementieren, der js unterstützt. Wenn Sie über eine große Menge an Inhalten verfügen, ist dies sehr, sehr wichtig Idee, Sie können einen Blick auf pyv8 werfen. Es gibt ein einfaches Browsermodell, das auf v8 basiert. Sie müssen es selbst tun. Füllen Sie einige Methoden aus Um dies zu erreichen, müssen Sie diese Funktionen zusätzlich zur JS-Engine (v8) und der http-Bibliothek (urllib2) implementieren. 1. Rufen Sie den in der Webseite enthaltenen JS-Code ab. 2. Erstellen Sie ein Browsermodell. einschließlich Verschiedener Ereignisse und Dom-Bäume. Darüber hinaus gibt es möglicherweise einige weitere Details zum von Yitao verwendeten Shopping-Preis-Crawler Verwendet auch nur die dritte Lösung. Der Crawler verwendet wahrscheinlich Webkit und Scrapy und ändert die Scrapy-Planungswarteschlange so, dass sie auf Redis basiert, um eine Verteilung zu erreichen:

Lassen Sie uns über einige Hintergrundinformationen sprechen. Daher sollten wir auf mögliche Blockierungssituationen achten. Es wird jedoch spekuliert, dass es in den Einstellungen einen Parameter gibt Damit die Pipeline nicht blockiert wird, kann die Pipeline im Thread-Pool ausgeführt werden (nicht überprüft). Die Pipeline wird im Allgemeinen zum Speichern der erfassten Informationen verwendet (Datenbank schreiben, Dateien schreiben), sodass Sie sich hier keine Gedanken über die Zeit machen müssen -verbrauchende Vorgänge, die das gesamte Framework blockieren, und es besteht keine Notwendigkeit, diesen Schreibvorgang als asynchron in Pipeline zu implementieren.
Darüber hinaus sind alle anderen Teile des Frameworks asynchron, die von der generierten Anforderung Der Crawler wird zum Herunterladen an den Planer übergeben, und der Crawler führt die Ausführung dann weiter aus. Nachdem der Planer den Download abgeschlossen hat, wird die Antwort zur Analyse an den Crawler übergeben.

Referenzbeispiele im Internet sind: Teil der in DownloaderMiddleware geschriebenen js-Unterstützung, und das Gleiche gilt für das Code-Snippet auf der offiziellen Scrapy-Website. Wenn es auf diese Weise implementiert wird, wird der Arbeitsmodus des Crawlers blockiert. Download-Parse-Download-Parse, anstelle des parallelen Herunterladens. Dies ist kein großes Problem beim Crawlen in kleinem Maßstab, das keine hohe Effizienz erfordert.

Ein besserer Ansatz ist die Unterstützung von Write js in Scrapys Downloader im Internet (unter Verwendung von Selenium PhantomJS). Es werden jedoch nur Get-Anfragen unterstützt.


Bei der Anpassung eines Webkits an Scrapys Downloader sind verschiedene Details erforderlich.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn