Bonjour, Habitants! Si la programmation est comme de la magie, alors le web scraping est une sorcellerie très puissante. En écrivant un simple programme automatisé, vous pouvez envoyer des requêtes à des serveurs Web, leur demander des données, puis les analyser et extraire les informations dont vous avez besoin. La nouvelle édition étendue du livre introduit non seulement le web scraping, mais permet également de collecter tout type de données sur Internet moderne. La partie I se concentre sur les mécanismes du scraping Web: comment utiliser Python pour demander des informations à un serveur Web, effectuer un traitement de réponse de serveur de base et organiser des interactions automatisées avec des sites. La deuxième partie explore des outils et des applications plus spécifiques qui sont utiles dans tout scénario de scraping Web. - Analyser des pages HTML complexes.- Développer des robots de recherche en utilisant le framework Scrapy. - Apprenez à stocker des données récupérées. - Lire et extraire les données des documents. - Nettoyez et normalisez les données mal formatées. - Lire et écrire des informations en langues naturelles. - Maîtrisez la recherche de formulaires et de connexions. - Apprenez le scraping JavaScript et le travail sur les API. - Utilisez et écrivez des programmes pour convertir des images en texte. - Apprenez à contourner les pièges à gratter et les bloqueurs de robots. - Testez votre propre site Web avec le grattage.- Apprenez le scraping JavaScript et le travail sur les API. - Utilisez et écrivez des programmes pour convertir des images en texte. - Apprenez à contourner les pièges à gratter et les bloqueurs de robots. - Testez votre propre site Web avec le grattage.- Apprenez le scraping JavaScript et le travail sur les API. - Utilisez et écrivez des programmes pour convertir des images en texte. - Apprenez à contourner les pièges à gratter et les bloqueurs de robots. - Testez votre propre site Web avec le grattage.
Exploration Web avec API
JavaScript est traditionnellement considéré comme la malédiction universelle des robots d'exploration du Web. Il y a longtemps, vous pouviez être sûr qu'une demande envoyée à un serveur Web recevrait les mêmes données qu'un utilisateur verrait dans son navigateur en effectuant la même demande.
À mesure que les méthodes JavaScript et Ajax de génération et de chargement de contenu prolifèrent, la situation décrite ci-dessus devient de moins en moins courante. Dans le chapitre 11, nous avons examiné une façon de résoudre ce problème: utiliser Selenium pour automatiser le navigateur et récupérer les données. Cela est facile à faire. Cela fonctionne presque toujours.
Le problème est que lorsque vous avez entre les mains un marteau aussi puissant et efficace que le sélénium, chaque tâche de grattage de la toile commence à ressembler à un clou.
Dans ce chapitre, vous apprendrez comment, en contournant tout ce JavaScript (sans l'exécuter ni même le charger!), Vous pouvez accéder directement à la source de données - les API qui génèrent ces données.
Une brève introduction à l'API
Il existe d'innombrables livres, présentations et tutoriels sur les nuances des API REST, GraphQL21, JSON et XML, mais ils sont tous basés sur un concept simple. L'API définit une syntaxe standardisée qui permet à un programme d'interagir avec un autre, même s'ils sont écrits dans des langues différentes ou ont des structures différentes.
Cette section se concentre sur les API Web (en particulier celles qui permettent au serveur Web d'interagir avec le navigateur), et nous entendons ici par API ce type d'interface. Mais vous pouvez garder à l'esprit que dans d'autres contextes, API est également un terme générique qui peut signifier, par exemple, une interface qui permet à un programme Java d'interagir avec un programme Python s'exécutant sur le même ordinateur. API ne signifie pas toujours «interface sur Internet» et n'a pas besoin d'inclure des technologies Web.
Les API Web sont les plus couramment utilisées par les développeurs pour interagir avec des services open source largement annoncés et bien documentés. Par exemple, la chaîne américaine de télévision sportive par câble ESPN fournit une API (http://www.espn.com/apis/devcenter/docs/) pour obtenir des informations sur les athlètes, les scores des matchs, etc. Google a une section développeur (https: / /console.developers.google.com) il existe des dizaines d'API pour la traduction linguistique, l'analyse et la géolocalisation.
La documentation de toutes ces API décrit généralement les routes ou les points de terminaison sous la forme d'URL qui peuvent être demandées, avec des paramètres modifiables, soit dans le cadre de ces URL, soit en tant que paramètres GET.
Par exemple, dans l'URL suivante, pathparam est un paramètre de chemin:
example.com/the-api-route/pathparam
Et ici pathparam est la valeur du paramètre param1:
example.com/the-api-route?param1=pathparam
Les deux méthodes de transfert de données vers l'API sont largement utilisées, bien que, comme de nombreux autres aspects de l'informatique, font l'objet de discussions philosophiques passionnées sur le moment et l'endroit où les variables doivent être transmises par chemin, et quand - via des paramètres.
La réponse à une demande d'API est généralement renvoyée au format JSON ou XML. De nos jours, JSON est beaucoup plus populaire que XML, mais ce dernier est également parfois rencontré. De nombreuses API vous permettent de choisir le type de réponse, généralement avec un autre paramètre qui détermine le type de réponse que vous souhaitez recevoir.
Voici un exemple de réponse JSON à une requête d'API:
{"user":{"id": 123, "name": "Ryan Mitchell", "city": "Boston"}}
Et voici la réponse à la requête API au format XML:
<user><id>123</id><name>Ryan Mitchell</name><city>Boston</city></user>
Le site ip-api.com (http://ip-api.com/) dispose d'une API claire et pratique qui convertit les adresses IP en adresses physiques réelles. Vous pouvez essayer de
faire une simple demande d'API en tapant l' adresse ip-api.com/json/50.78.253.58 suivant dans votre navigateur,
et vous obtiendrez une réponse comme celle-ci:
{"ip":"50.78.253.58","country_code":"US","country_name":"United States", "region_code":"MA","region_name":"Massachusetts","city":"Boston", "zip_code":"02116","time_zone":"America/New_York","latitude":42.3496, "longitude":-71.0746,"metro_code":506}
Notez qu'il existe un paramètre de chemin json dans la requête. Pour obtenir une réponse au format XML ou CSV, vous devez la remplacer par le format approprié:
ip-api.com/xml/50.78.253.58
ip-api.com/csv/50.78.253.58
API et méthodes HTTP
Dans la section précédente , nous avons examiné l'API, en envoyant une requête GET au serveur pour obtenir des informations. Il existe quatre manières (ou méthodes) principales de demander des informations à un serveur Web via HTTP:
- GET;
- PUBLIER;
- METTRE;
- EFFACER.
Techniquement, il existe plus de quatre types de requêtes (par exemple, il existe toujours HEAD, OPTIONS et CONNECT), mais elles sont rarement utilisées dans l'API et il est peu probable que vous les rencontriez un jour. La grande majorité des API sont limitées à ces quatre méthodes, et parfois même à une partie d'entre elles. Il existe toujours des API qui utilisent uniquement GET ou uniquement GET et POST.
GET est la demande que vous utilisez lorsque vous visitez un site en saisissant son adresse dans la barre d'adresse de votre navigateur. Lorsque vous visitez ip-api.com/json/50.78.253.58 , vous utilisez la méthode GET. Cette requête peut être considérée comme une commande: "Hé, serveur Web, donnez-moi ces informations s'il vous plaît."
Une requête GET, par définition, ne modifie pas le contenu de la base de données du serveur. Rien n'est sauvé et rien n'est changé. Les informations sont uniquement lues.
POST est une requête qui est utilisée lors du remplissage d'un formulaire ou de la soumission d'informations, vraisemblablement destinée à être traitée par un script serveur. Chaque fois que vous vous connectez au site, vous faites une demande POST, en transmettant un nom d'utilisateur et (espérons-le) un mot de passe crypté. En effectuant une requête POST via l'API, vous dites au serveur: «Veuillez enregistrer ces informations dans la base de données».
La requête PUT lors de l'interaction avec les sites est utilisée moins souvent, mais de temps en temps, elle se produit dans l'API. Cette demande est utilisée pour modifier un objet ou une information. Par exemple, l'API peut utiliser une requête POST pour créer un utilisateur et une requête PUT pour modifier son adresse e-mail.
Les requêtes DELETE, comme vous pouvez le deviner, sont utilisées pour supprimer un objet. Par exemple, si vous envoyez une requête DELETE à myapi.com/user/23 , l'ID utilisateur 23 sera supprimé. Les méthodes DELETE ne se trouvent pas souvent dans les API ouvertes, car elles sont principalement créées pour diffuser des informations ou pour permettre aux utilisateurs de créer ou publier des informations, mais ne les supprimez pas des bases de données.
Contrairement aux requêtes GET, POST, PUT et DELETE permettent de transmettre des informations dans le corps de la requête, en plus de l'URL ou de la route à partir de laquelle les données sont demandées.
Comme la réponse reçue du serveur Web, ces données dans le corps de la requête sont généralement JSON ou moins souvent XML. Le format de données spécifique est déterminé par la syntaxe de l'API. Par exemple, lorsque vous utilisez une API qui ajoute des commentaires aux articles de blog, vous pouvez créer la requête PUT suivante:
example.com/comments?post=123
avec un corps de requête comme celui-ci:
{"title": "Great post about APIs!", "body": "Very informative. Really helped me out with a tricky technical challenge I was facing. Thanks for taking the time to write such a detailed blog post about PUT requests!", "author": {"name": "Ryan Mitchell", "website": "http://pythonscraping.com", "company": "O'Reilly Media"}}
Notez que l'ID de l'article de blog (123) est passé en tant que paramètre dans l'URL et que le contenu du commentaire que nous créons est passé dans le corps de la requête. Les paramètres et les données peuvent être transmis à la fois dans le paramètre et dans le corps de la requête. Quels paramètres sont requis et où ils sont transmis - encore une fois, est déterminé par la syntaxe de l'API.
En savoir plus sur la réponse aux demandes d'API
Comme nous l'avons vu dans l'exemple ip-api.com au début de ce chapitre, une caractéristique importante des API est que ces interfaces renvoient des réponses bien formatées. Les formats de réponse les plus courants sont XML (eXtensible Markup Language) et JSON (JavaScript Object Notation).
Ces dernières années, JSON est devenu beaucoup plus populaire que XML pour plusieurs raisons principales. Premièrement, les fichiers JSON sont généralement plus petits que les fichiers XML bien conçus. Comparez, par exemple, les données XML suivantes de 98 caractères:
<user><firstname>Ryan</firstname><lastname>Mitchell</
lastname><username>Kludgist</username></user>
Maintenant, regardez les mêmes données JSON:
{"user":{"firstname":"Ryan","lastname":"Mitchell","username":"Kludgist"}}
Cela ne représente que 73 caractères, soit 36% de moins que les mêmes données XML.
Bien sûr, l'argument est probable que XML peut être formaté comme ceci:
<user firstname="ryan" lastname="mitchell" username="Kludgist"></user>
Cependant, cela n'est pas recommandé car cette vue ne prend pas en charge l'imbrication approfondie des données. Pourtant, l'entrée comporte 71 caractères - à peu près la même chose que l'équivalent JSON.
Une autre raison pour laquelle JSON devient si rapidement plus populaire que XML est liée à l'évolution des technologies Web. Auparavant, les destinataires d'API étaient principalement des scripts côté serveur PHP ou .NET. Maintenant, il se peut qu'un framework comme Angular ou Backbone reçoive et envoie des appels API. Dans une certaine mesure, les technologies de serveur ne se soucient pas de la forme que prennent les données. Cependant, les bibliothèques JavaScript comme Backbone trouvent plus facile de gérer JSON.
Il est généralement admis que les API renvoient une réponse au format XML ou JSON, mais toute autre option est possible. Le type de réponse API n'est limité que par l'imagination du programmeur qui a créé cette interface. Un autre format de réponse typique est CSV (comme le montre l'exemple d'ip-api.com). Des API distinctes vous permettent même de créer des fichiers. Vous pouvez envoyer une demande au serveur, qui générera une image avec le texte spécifié superposé dessus, ou vous pouvez demander un fichier XLSX ou PDF spécifique.
Certaines API ne renvoient pas du tout de réponse. Par exemple, si vous envoyez une demande au serveur pour créer un commentaire sur un article de blog, il ne peut renvoyer qu'un code de réponse HTTP de 200, ce qui signifie: «J'ai publié un commentaire; tout va bien!" D'autres requêtes peuvent renvoyer une réponse minimale comme celle-ci:
{"success": true}
En cas d'erreur, vous pouvez obtenir la réponse suivante:
{"error": {"message": "Something super bad happened"}}
Sinon, si l'API n'est pas bien configurée, vous pourriez vous retrouver avec une trace de pile indéchiffrable ou du texte en anglais. Lors de l'envoi d'une requête à une API, il est généralement judicieux de vérifier d'abord que la réponse que vous recevez est bien au format JSON (ou XML, ou CSV, ou quel que soit le format que vous prévoyez de recevoir).
A propos de l'auteur
Ryan Mitchell est ingénieur logiciel senior chez HedgeServ, Boston, où elle développe des API et des outils d'analyse de données. Ryan est diplômé du College of Engineering and Technology. Franklin V. Olin est titulaire d'une maîtrise en génie logiciel et d'un certificat en analyse et traitement des données des cours de formation continue de l'Université Harvard. Avant de rejoindre HedgeServ, Ryan a travaillé chez Abine, où elle a développé des web scrapers et des outils d'automatisation en Python. Il conseille régulièrement sur des projets de web scraping pour le retail, la finance et la pharmacie. Travaille simultanément en tant que consultant et enseignant indépendant à la Northeastern University et au College of Engineering and Technology. Franklin V. Olin.
Plus de détails sur le livre peuvent être trouvés sur le site de la maison d'édition
» Table des matières
» Extrait
Pour Habitants un rabais de 25% sur le coupon - Python
Lors du paiement de la version papier du livre, un e-book est envoyé à l'e -poster.