[PYTHON] So crawlen Sie Seiten, die unendlich scrollen

Was ist unendliches Scrollen?

Sie können es auf den Facebook- und Twitter-Timelines sehen, zum Ende der Seite scrollen und es werden neue Informationen geladen.

Motivation

Der Grund, warum ich mich entschied, die unendliche Bildlaufseite zu crawlen, war, dass ich wegen Schulproblemen an Tweets auf Twitter vorbeischauen musste. Nun, Sie sagen, dass Twitter eine offizielle API hat. Die offizielle Twitter-API ist nicht sehr freundlich und so konzipiert, dass Sie keine Tweets erhalten können, die älter als eine Woche sind **. Mit anderen Worten, wenn Sie ältere Tweets erhalten möchten, müssen Sie sich selbst kriechen. Und da Twitter-Suchergebnisse mit ** infinite scroll ** angezeigt werden, müssen Sie die Seite crawlen, die unendlich scrollt.

Warum es schwierig ist, unendliche Schriftrollen zu kriechen

Der Crawler funktioniert grundsätzlich wie folgt:

  1. Holen Sie sich die HTML-Antwort von der angegebenen URL und verarbeiten Sie sie
  2. Suchen Sie die URL, die in der Antwort weiter gecrawlt werden soll
  3. Machen Sie 1-2 erneut mit der neuen URL

Auf diese Weise wird eine große Datenmenge aus dem Netz abgerufen. Das Problem beim Crawlen von Seiten mit unendlichem Bildlauf ist das Blättern (wie man durch Suchergebnisse usw. mit Links wie "1 Seite", "2 Seiten", "nächste Seite" unten navigiert). Im Gegensatz zu der von mir verwendeten Seite ** gibt es im HTML-Code der Seite keinen Link zum nächsten Suchergebnis **. Dies bedeutet, dass vorhandene Crawler-Frameworks (wie Scrapy for Python) nicht konkurrieren können. Dieses Mal werde ich vorstellen, wie man eine so mühsame unendliche Bildlaufseite crawlt, auch als mein eigenes Memo.

Illustration

Selbst wenn ich nur die Theorie einführe, erkläre ich dies anhand des Crawlers, den ich tatsächlich geschrieben habe und der als Beispiel vergangene Tweets von Twitter abruft. Die Quelle finden Sie im Github-Repository. https://github.com/keitakurita/twitter_past_crawler

Apropos,

$ pip install twitterpastcrawler

Aber Sie können es installieren.

Methode

Unendlicher Bildlaufmechanismus

Wie funktioniert das unendliche Scrollen überhaupt? Selbst die unendliche Schriftrolle, dass Sie die Unendlichkeit des Ergebnisses irgendwo im Voraus laden, ist die Datenmenge unmöglich. Mit anderen Worten, beim unendlichen Scrollen werden jedes Mal, wenn der Benutzer nach unten scrollt, ** dynamisch ** zusätzliche Daten hinzugefügt. Damit das unendliche Scrollen funktioniert,

  1. Kennen Sie den aktuell angezeigten Bereich
  2. Kennen Sie auf dieser Grundlage die Daten, die als Nächstes abgerufen werden sollen Sie müssen in der Lage sein. In den meisten Fällen verfügt das unendliche Scrollen über einen ** Schlüsselparameter **, der den ** aktuell angezeigten Bereich ** darstellt, und verwendet diesen Parameter, um die folgenden Ergebnisse zu erhalten:

Für Twitter

Sie können analysieren, wie dies tatsächlich erreicht wird, indem Sie sich ansehen, welche Art von Anfrage Twitter hinter den Kulissen sendet. Suchen Sie als Test nach dem Wort Qiita. Ich verwende Chrome, aber jeder Browser kann den Status des Netzwerks sehen, das hinter der Seite ausgeführt wird. Für Chrome können Sie es unter "Ansicht" -> "Entwicklung / Verwaltung" -> "Entwicklertools" -> Netzwerk anzeigen. Wenn Sie es öffnen, sollte ein Bildschirm wie der folgende angezeigt werden: Network状況を表示

Wenn Sie einige Male nach unten scrollen, wird eine verdächtige URL angezeigt, die mehrmals in der Liste der Anforderungen angezeigt wird:

https://twitter.com/i/search/timeline?vertical=default&q=qiita&src=typd&composed_count=0&include_available_features=1&include_entities=1&include_new_items_bar=true&interval=30000&lang=en&latent_count=0&min_position=TWEET-829694142603145216-833144090631942144-BD1UO2FFu9QAAAAAAAAETAAAAAcAAAASAAAAAAAAQAAEIIAAAAYAAAAAAACAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAIAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAEAIACAIQIAAAgAAAAAAAASAAAAAAAAAAAAAAAAAAAAAA

Dieser letzte Parameter, "min_position", ist offensichtlich verdächtig. Wenn Sie das Ergebnis dieser Antwort herunterladen und sehen, können Sie sehen, dass es sich um eine Antwort im JSON-Format handelt. Mit Blick auf den Inhalt,

focused_refresh_interval: 240000
has_more_items: false
items_html: ...
max_position: "TWEET-829694142603145216-833155909996077056-BD1UO2FFu9QAAAAAAAAETAAAAAcAAAASAAAAAAAAQAAEIIAAAAYAAAAAAACAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAEAAAAAAAAAAAABAAAAAAAAAAAAAIAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAEAIACAIQIAAAgAAAAAAAASAAAAAAAAAAAAAAAAAAAAAA"

items_html enthält das rohe HTML des Tweets. Dies ist der Inhalt des Tweets, den Sie suchen. Bemerkenswert ist der Parameter max_position. Es sollte das gleiche Format wie der vorherige Parameter namens "min_position" haben. Wenn Sie versuchen, dies mit der "min_position" der vorherigen URL auszutauschen und die Anfrage erneut zu senden, erhalten Sie eine Antwort im gleichen Format. Mit anderen Worten, diese "min_position" ist der zu suchende Schlüsselparameter.

Wie man kriecht

An diesem Punkt ist der Rest einfach. Im Prinzip können Sie crawlen, indem Sie den folgenden Vorgang wiederholen:

  1. Senden Sie eine Anfrage, indem Sie die Parameter (z. B. q: query) der URL im vorherigen Format anpassen.
  2. Holen Sie sich "items_html" und "max_position" aus der erhaltenen Antwort im JSON-Format.
  3. Verarbeiten Sie den Inhalt von items_html entsprechend
  4. Ersetzen Sie "max_position" durch "min_position" und senden Sie die Anfrage
  5. Wiederholen Sie die Schritte 2-4

Wie benutzt man Twitterpastcrawler

In dem Paket, das ich erstellt habe, wird der obige Vorgang automatisch ausgeführt, indem die Abfrageinformationen wie unten gezeigt in die CSV-Datei ausgegeben werden.

sample.py


import twitterpastcrawler

crawler = twitterpastcrawler.TwitterCrawler(
                            query="qiita", #Suchen Sie nach Tweets, die das Schlüsselwort qiita enthalten
                            output_file="qiita.csv" # qiita.Geben Sie Tweet-Informationen in eine Datei namens csv aus
                        )

crawler.crawl() #Beginnen Sie zu kriechen

Schließlich

Wenn Sie an Tweets von Twitter vorbeikommen, können Sie herausfinden, welche Art von Tweets während eines bestimmten Ereignisses (z. B. Wahl- oder Spielveröffentlichungsdatum) erstellt wurden, was interessant ist. Überlegen. Da die Anzahl der Seiten mit unendlichem Bildlauf zunimmt, denke ich, dass die Verwendung von Crawl-Seiten mit unendlichem Bildlauf in Zukunft zunehmen wird.

Recommended Posts

So crawlen Sie Seiten, die unendlich scrollen
So beenden Sie Pythons unendliches Scroll-Scraping
So kratzen Sie Seiten, denen in Selenium + Headless Chrome "Zugriff verweigert" wurde
So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
[Python] So schreiben Sie eine Dokumentzeichenfolge, die PEP8 entspricht
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Schaben 2 Wie man kratzt
Verwendung von Image-Match
Wie man Shogun benutzt
So installieren Sie Python
Verwendung von Pandas 2
Wie man PyPI liest
So installieren Sie pip
Verwendung von Virtualenv
Verwendung von numpy.vectorize
So aktualisieren Sie easy_install
So installieren Sie archlinux
Verwendung von pytest_report_header
Wie man Gunicorn neu startet
So installieren Sie Python
Wie zum virtuellen Host
Wie man Selen debuggt
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Wie man JSON liest
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
So aktualisieren Sie Spyder
Verwendung von IPython
So installieren Sie BayesOpt
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Wie man Dotfiles züchtet
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
"Wie man Fukashigi zählt"
So installieren Sie Nbextensions
Verwendung von OptParse
Verwendung von return
So installieren Sie Prover9
So bedienen Sie NumPy
Wie man Imutils benutzt
So testen Sie, ob die Ausnahme in Python unittest ausgelöst wird
So schreiben Sie einen Test für die Verarbeitung mit BigQuery
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt