[PYTHON] Comment explorer des pages qui défilent à l'infini

Qu'est-ce que le défilement infini?

Vous pouvez le voir sur les chronologies Facebook et Twitter, faites défiler vers le bas de la page et il chargera de nouvelles informations.

Motivation

La raison pour laquelle j'ai décidé d'explorer la page de défilement infini était parce que je devais passer des tweets sur Twitter à cause de problèmes scolaires. Eh bien, vous dites que Twitter a une API officielle. L'API Twitter officielle n'est pas très conviviale et est conçue pour que vous ne puissiez pas recevoir de tweets datant de plus d'une semaine **. En d'autres termes, si vous souhaitez obtenir des tweets plus anciens, vous devez vous explorer. Et puisque les résultats de recherche Twitter sont affichés avec ** défilement infini **, vous devez explorer la page qui défile à l'infini.

Pourquoi il est difficile d'explorer des parchemins infinis

Le robot fonctionne essentiellement comme suit:

  1. Obtenez la réponse HTML à partir de l'URL donnée et traitez-la
  2. Recherchez l'URL à explorer plus avant dans la réponse
  3. Répétez 1-2 avec la nouvelle URL

De cette manière, une grande quantité de données est extraite du réseau. Le problème de l'exploration des pages à défilement infini est la pagination (comment naviguer dans les résultats de recherche, etc. avec des liens tels que "1 page", "2 pages", "page suivante" ci-dessous) Contrairement à la page que j'utilise, ** il n'y a pas de lien vers le résultat de recherche suivant sur le HTML de la page **. Cela signifie que les frameworks de robots existants (tels que Scrapy pour Python) ne peuvent pas rivaliser. Cette fois, je vais vous présenter comment explorer une page à défilement infini aussi gênante, également dans mon propre mémo.

Illustration

Même si je n'introduis que la théorie, j'expliquerai en utilisant le robot d'exploration que j'ai réellement écrit et qui extrait les tweets de Twitter à titre d'exemple. Veuillez vous référer au référentiel Github pour la source. https://github.com/keitakurita/twitter_past_crawler

Au fait,

$ pip install twitterpastcrawler

Mais vous pouvez l'installer.

Méthode

Mécanisme de défilement infini

Alors, comment fonctionne le défilement infini en premier lieu? Même le défilement infini, que vous chargez l'infini du résultat à l'avance quelque part est la quantité de données impossible. En d'autres termes, le défilement infini consiste ** dynamiquement ** à ajouter des données supplémentaires à chaque fois que l'utilisateur fait défiler vers le bas. Par conséquent, pour que le défilement infini fonctionne,

  1. Connaître la plage actuellement affichée
  2. Sur cette base, connaissez les données à extraire ensuite Vous devez pouvoir le faire. Dans la plupart des cas, le défilement infini a un ** paramètre clé ** qui représente la ** plage actuellement affichée ** et utilise ce paramètre pour obtenir les résultats suivants:

Pour Twitter

Vous pouvez analyser comment cela est réellement réalisé en examinant le type de demande que Twitter envoie dans les coulisses. Pour tester, recherchez le mot qiita. J'utilise Chrome, mais n'importe quel navigateur peut voir l'état du réseau fonctionnant derrière la page. Pour Chrome, vous pouvez le voir depuis "Affichage" -> "Développement / Gestion" -> "Outils de développement" -> Réseau. Lorsque vous l'ouvrez, vous devriez voir un écran comme celui ci-dessous: Network状況を表示

Si vous faites défiler vers le bas plusieurs fois, vous verrez une URL suspecte qui apparaît plusieurs fois dans la liste des requêtes:

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

Ce dernier paramètre, min_position, est évidemment suspect. Si vous téléchargez le résultat de cette réponse et le voyez, vous pouvez voir qu'il s'agit d'une réponse au format json. En regardant le contenu,

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

ʻItems_htmlcontient le html brut du tweet. C'est le contenu du tweet que vous recherchez. Il convient de noter le paramètre «max_position». Il doit avoir le même format que le paramètre précédent appelémin_position. Si vous essayez d'échanger ceci avec la min_position` de l'url précédente et de renvoyer la requête, vous obtiendrez une réponse du même format. En d'autres termes, cette «min_position» est le paramètre clé à rechercher.

Comment explorer

À ce stade, le reste est facile. En principe, vous pouvez analyser en répétant le processus suivant:

  1. Envoyez une requête en ajustant les paramètres (par exemple, q: query) de l'url au format précédent.
  2. Récupérez ʻitems_html et max_position` à partir de la réponse au format json obtenue.
  3. Traitez correctement le contenu de ʻitems_html`
  4. Remplacez max_position au lieu de min_position et envoyez la requête
  5. Répétez les étapes 2 à 4

Comment utiliser twitterpastcrawler

Dans le package que j'ai créé, simplement en donnant une requête, le processus ci-dessus est automatiquement exécuté et les informations du tweet sont crachées dans le fichier csv comme indiqué ci-dessous.

sample.py


import twitterpastcrawler

crawler = twitterpastcrawler.TwitterCrawler(
                            query="qiita", #Rechercher des tweets contenant le mot-clé qiita
                            output_file="qiita.csv" # qiita.Sortie des informations du tweet dans un fichier appelé csv
                        )

crawler.crawl() #Commencer à explorer

finalement

Si vous pouvez passer outre les tweets de Twitter, vous pouvez découvrir quel type de tweets a été créé lors d'un certain événement (par exemple, une élection ou une date de sortie de jeu), ce qui est intéressant. pense. Étant donné que le nombre de pages à défilement infini augmente, je pense que l'utilisation de pages d'exploration avec défilement infini se développera à l'avenir.

Recommended Posts

Comment explorer des pages qui défilent à l'infini
Comment mettre fin au grattage de défilement infini de Python
Comment supprimer des pages dont l'accès est refusé dans Selenium + Headless Chrome
Comment résoudre la fonction récursive qui a résolu abc115-D
[Python] Comment écrire une docstring conforme à PEP8
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser virtualenv
Grattage 2 Comment gratter
Comment utiliser la correspondance d'image
Comment utiliser le shogun
Comment installer Python
Comment utiliser Pandas 2
Comment lire PyPI
Comment installer pip
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment mettre à jour easy_install
Comment installer Archlinux
Comment utiliser pytest_report_header
Comment redémarrer gunicorn
Comment installer python
Comment héberger virtuel
Comment déboguer le sélénium
Comment utiliser partiel
Comment utiliser Bio.Phylo
Comment lire JSON
Comment utiliser SymPy
Comment utiliser x-means
Comment utiliser WikiExtractor.py
Comment mettre à jour Spyder
Comment utiliser IPython
Comment installer BayesOpt
Comment utiliser virtualenv
Comment utiliser Matplotlib
Comment utiliser iptables
Comment utiliser numpy
Comment utiliser TokyoTechFes2015
Comment utiliser venv
Comment utiliser le dictionnaire {}
Comment utiliser Pyenv
Comment faire pousser des fichiers dot
Comment utiliser la liste []
Comment utiliser python-kabusapi
"Comment compter Fukashigi"
Comment installer Nbextensions
Comment utiliser OptParse
Comment utiliser le retour
Comment installer Prover9
Comment utiliser NumPy
Comment utiliser pyenv-virtualenv
Comment utiliser imutils
Comment tester cette exception est déclenchée dans python unittest
Comment rédiger un test de traitement utilisant BigQuery
Comment écrire une classe méta qui prend en charge à la fois python2 et python3