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.
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:
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.
Bei der Anpassung eines Webkits an Scrapys Downloader sind verschiedene Details erforderlich.