Ich versuche einen einfachen Web Scraper zu entwickeln. Ich möchte Text ohne den HTML-Code extrahieren. Tatsächlich erreiche ich dieses Ziel, aber ich habe gesehen, dass ich auf einigen Seiten, auf denen JavaScript geladen ist, keine guten Ergebnisse erzielt habe.
Wenn beispielsweise ein JavaScript-Code Text hinzufügt, kann ich ihn nicht sehen, da ich ihn anrufe
response = urllib2.urlopen(request)
Ich erhalte den Originaltext ohne den hinzugefügten (da JavaScript im Client ausgeführt wird).
Ich suche nach Ideen, um dieses Problem zu lösen.
python
web-scraping
python-2.x
urlopen
Mocopera
quelle
quelle
Antworten:
EDIT 30 / Dec / 2017: Diese Antwort wird in den Top-Ergebnissen der Google-Suche angezeigt, daher habe ich beschlossen, sie zu aktualisieren. Die alte Antwort ist noch am Ende.
Dryscape wird nicht mehr gepflegt und die von Dryscape-Entwicklern empfohlene Bibliothek ist nur noch Python 2. Ich habe festgestellt, dass die Python-Bibliothek von Selenium mit Phantom JS als Web-Treiber schnell genug und einfach ist, um die Arbeit zu erledigen.
Stellen Sie nach der Installation von Phantom JS sicher, dass die
phantomjs
Binärdatei im aktuellen Pfad verfügbar ist:Beispiel
Als Beispiel habe ich eine Beispielseite mit folgendem HTML-Code erstellt. ( Link ):
ohne Javascript heißt es:
No javascript support
und mit Javascript:Yay! Supports javascript
Scraping ohne JS-Unterstützung:
Scraping mit JS-Unterstützung:
Sie können auch Python Library Dryscrape verwenden , um Javascript-gesteuerte Websites zu kratzen.
Scraping mit JS-Unterstützung:
quelle
@Expenzor
Ich arbeite an Fenstern. PhantomJS funktioniert gut.Wir erhalten nicht die richtigen Ergebnisse, da alle mit Javascript generierten Inhalte im DOM gerendert werden müssen. Wenn wir eine HTML-Seite abrufen, rufen wir die Initiale DOM ab, die nicht durch Javascript geändert wurde.
Daher müssen wir den Javascript-Inhalt rendern, bevor wir die Seite crawlen.
Da Selen in diesem Thread bereits oft erwähnt wird (und wie langsam es manchmal wird, wurde auch erwähnt), werde ich zwei weitere mögliche Lösungen auflisten.
Lösung 1: Dies ist ein sehr schönes Tutorial zur Verwendung von Scrapy zum Crawlen von mit Javascript generierten Inhalten. Wir werden genau dem folgen.
Was wir brauchen werden:
Docker in unserer Maschine installiert. Dies ist bis zu diesem Zeitpunkt ein Plus gegenüber anderen Lösungen, da eine betriebssystemunabhängige Plattform verwendet wird.
Installieren Sie Splash gemäß den Anweisungen für unser entsprechendes Betriebssystem.
Zitat aus der Splash-Dokumentation:
Im Wesentlichen werden wir Splash verwenden, um von Javascript generierten Inhalt zu rendern.
Führen Sie den Splash-Server aus :
sudo docker run -p 8050:8050 scrapinghub/splash
.Installieren Sie das Scrapy-Splash- Plugin:
pip install scrapy-splash
Angenommen, wir haben bereits ein Scrapy-Projekt erstellt (wenn nicht, erstellen wir eines ), folgen wir der Anleitung und aktualisieren Folgendes
settings.py
:Schließlich können wir Folgendes verwenden
SplashRequest
:Lösung 2: Nennen wir dies momentan experimentell (Mai 2018) ...
Diese Lösung ist (derzeit) nur für Pythons Version 3.6 .
Kennen Sie das Anforderungsmodul (na wer nicht)?
Jetzt hat es ein Web, das kleine Geschwister crawlt: Anfragen-HTML :
Installieren Sie request-html:
pipenv install requests-html
Stellen Sie eine Anfrage an die URL der Seite:
Rendern Sie die Antwort, um die von Javascript generierten Bits zu erhalten:
Schließlich scheint das Modul Scraping-Funktionen zu bieten .
Alternativ können wir die gut dokumentierte Art der Verwendung von BeautifulSoup mit dem
r.html
gerade gerenderten Objekt ausprobieren .quelle
r.html.html
Objekt in die Seite eingefügt werden .Vielleicht kann Selen das.
quelle
Wenn Sie das
Requests
Modul schon einmal für Python verwendet haben, habe ich kürzlich herausgefunden, dass der Entwickler ein neues Modul namens erstellt hat,Requests-HTML
das jetzt auch JavaScript rendern kann.Sie können auch https://html.python-requests.org/ besuchen , um mehr über dieses Modul zu erfahren. Wenn Sie nur Interesse am Rendern von JavaScript haben, können Sie https://html.python-requests.org/?#javascript besuchen -Unterstützung, um direkt zu lernen, wie man das Modul zum Rendern von JavaScript mit Python verwendet.
Wenn Sie das
Requests-HTML
Modul korrekt installiert haben , zeigt das folgende Beispiel, das unter dem obigen Link gezeigt wird , wie Sie mit diesem Modul eine Website kratzen und das auf der Website enthaltene JavaScript rendern können:Das habe ich kürzlich aus einem YouTube-Video erfahren. Klicke hier! um das YouTube-Video anzusehen, das zeigt, wie das Modul funktioniert.
quelle
Dies scheint auch eine gute Lösung zu sein, entnommen aus einem großartigen Blog-Beitrag
quelle
Es hört sich so an, als ob auf die Daten, nach denen Sie wirklich suchen, über eine sekundäre URL zugegriffen werden kann, die von einem Javascript auf der primären Seite aufgerufen wird.
Während Sie versuchen könnten, Javascript auf dem Server auszuführen, um dies zu handhaben, besteht ein einfacherer Ansatz darin, die Seite mit Firefox zu laden und ein Tool wie Charles oder Firebug zu verwenden, um genau zu identifizieren, um welche sekundäre URL es sich handelt. Dann können Sie diese URL einfach direkt nach den Daten abfragen, an denen Sie interessiert sind.
quelle
Selen eignet sich am besten zum Scrapen von JS- und Ajax-Inhalten.
In diesem Artikel finden Sie Informationen zum Extrahieren von Daten aus dem Web mit Python
Laden Sie dann den Chrome-Webdriver herunter.
Einfach richtig?
quelle
Sie können Javascript auch mit dem Webdriver ausführen.
oder speichern Sie den Wert in einer Variablen
quelle
driver.title
Eigenschaft nutzenIch persönlich bevorzuge die Verwendung von Scrapy und Selen und das Andocken beider in getrennten Behältern. Auf diese Weise können Sie moderne Websites, die fast alle Javascript in der einen oder anderen Form enthalten, mit minimalem Aufwand installieren und crawlen. Hier ist ein Beispiel:
Verwenden Sie die
scrapy startproject
, um Ihren Schaber zu erstellen und Ihre Spinne zu schreiben. Das Skelett kann so einfach sein:Die wahre Magie findet in der Middleware statt. Überschreiben Sie zwei Methoden in der Downloader-Middleware
__init__
und zwarprocess_request
auf folgende Weise:Vergessen Sie nicht, diese Middlware zu aktivieren, indem Sie die nächsten Zeilen in der Datei settings.py auskommentieren:
Weiter zur Dockerisierung. Erstellen Sie Ihr
Dockerfile
Image aus einem einfachen Image (ich verwende hier Python Alpine), kopieren Sie Ihr Projektverzeichnis in das Image und installieren Sie die Anforderungen:Und zum Schluss alles zusammen in
docker-compose.yaml
:Ausführen
docker-compose up -d
. Wenn Sie dies zum ersten Mal tun, dauert es eine Weile, bis das neueste Selen / Standalone-Chrom abgerufen und Ihr Scraper-Image erstellt wurde.Sobald dies erledigt ist, können Sie überprüfen, ob Ihre Container ausgeführt werden
docker ps
und ob der Name des Selencontainers mit dem der Umgebungsvariablen übereinstimmt, die wir an unseren Scraper-Container übergeben haben (hier war esSELENIUM_LOCATION=samplecrawler_selenium_1
).Geben Sie Ihren Scraper-Container mit ein
docker exec -ti YOUR_CONTAINER_NAME sh
, der Befehl für mich lautetedocker exec -ti samplecrawler_my_scraper_1 sh
: CD in das richtige Verzeichnis und führen Sie Ihren Scraper mit ausscrapy crawl my_spider
.Das Ganze ist auf meiner Github-Seite und du kannst es von hier bekommen
quelle
Eine Mischung aus BeautifulSoup und Selen funktioniert bei mir sehr gut.
PS Weitere Wartebedingungen finden Sie hier
quelle
Sie möchten urllib-, request-, beautifulSoup- und Selenium-Webtreiber in Ihrem Skript für verschiedene Teile der Seite verwenden (um nur einige zu nennen).
Manchmal bekommen Sie mit nur einem dieser Module das, was Sie brauchen.
Manchmal benötigen Sie zwei, drei oder alle diese Module.
Manchmal müssen Sie das js in Ihrem Browser ausschalten.
Manchmal benötigen Sie Header-Informationen in Ihrem Skript.
Keine Website kann auf die gleiche Weise gekratzt werden, und keine Website kann für immer auf die gleiche Weise gekratzt werden, ohne dass Sie Ihren Crawler normalerweise nach einigen Monaten ändern müssen. Aber sie können alle abgekratzt werden! Wo ein Wille ist, ist auch ein Weg sicher.
Wenn Sie kontinuierlich Daten in die Zukunft kratzen müssen, kratzen Sie einfach alles, was Sie brauchen, und speichern Sie es in .dat-Dateien mit pickle.
Suchen Sie einfach weiter, wie Sie mit diesen Modulen versuchen können, und kopieren Sie Ihre Fehler und fügen Sie sie in Google ein.
quelle
Verwenden von PyQt5
quelle
Ich habe zwei Tage lang versucht, eine Antwort auf diese Fragen zu finden. Viele Antworten leiten Sie zu verschiedenen Themen. Aber die obige Antwort von serpentr ist wirklich auf den Punkt. Es ist die kürzeste und einfachste Lösung. Nur zur Erinnerung, das letzte Wort "var" stellt den Variablennamen dar und sollte daher verwendet werden als:
quelle
Ich musste mich bei einigen eigenen Web-Scraping-Projekten mit diesem Problem befassen. Ich habe damit umgegangen, indem ich mithilfe der Python-Anforderungsbibliothek eine http-Anforderung direkt an die API gesendet habe, anstatt die JS laden zu müssen.
Die Python-Anforderungsbibliothek funktioniert hierfür gut. Sie können die http-Anforderungen anzeigen, indem Sie das Inspect-Element verwenden und zur Registerkarte "Netzwerk" navigieren.
quelle