Maison >développement back-end >Tutoriel Python >conseils pour penser comme un expert du web scraping
Généralement, les tutoriels se concentrent sur les aspects techniques, sur ce que vous pouvez reproduire : "Commencez ici, suivez ce chemin, et vous finirez ici." C'est idéal pour apprendre une technologie particulière, mais il est parfois difficile de comprendre pourquoi l'auteur a décidé de faire les choses d'une certaine manière ou ce qui guide son processus de développement.
Un des membres de notre communauté a écrit ce blog en guise de contribution au blog Crawlee. Si vous souhaitez contribuer à des blogs comme ceux-ci sur Crawlee Blog, veuillez nous contacter sur notre chaîne Discord.
Dans ce blog, je discuterai des règles et principes généraux qui me guident lorsque je travaille sur des projets de web scraping et me permettent d'obtenir d'excellents résultats.
Alors, explorons l'état d'esprit d'un développeur de web scraping.
Lorsque vous commencez à travailler sur un projet, vous disposez probablement d'un site cible à partir duquel vous devez extraire des données spécifiques. Vérifiez les possibilités offertes par ce site ou cette application pour l'extraction de données. Voici quelques options possibles :
Si une source de données échoue, essayez d'accéder à une autre source disponible.
Par exemple, pour Yelp, les trois options sont disponibles, et si l'API officielle ne vous convient pas pour une raison quelconque, vous pouvez essayer les deux autres.
Je pense que tout le monde connaît les robots.txt et le plan du site d'une manière ou d'une autre, mais je vois régulièrement des gens les oublier tout simplement. Si vous en entendez parler pour la première fois, voici une explication rapide :
Puisque vous n'êtes pas Google ou tout autre moteur de recherche populaire, les règles du robot dans robots.txt seront probablement contre vous. Mais combiné au plan du site, c'est un bon endroit pour étudier la structure du site, l'interaction attendue avec les robots et les agents utilisateurs non-navigateurs. Dans certaines situations, cela simplifie l'extraction des données du site.
Par exemple, en utilisant le plan du site Crawlee, vous pouvez facilement obtenir des liens directs vers des articles à la fois pour toute la durée de vie du blog et pour une période spécifique. Une simple vérification et vous n'avez pas besoin d'implémenter une logique de pagination.
Une analyse approfondie du site est une condition préalable importante pour créer un web scraper efficace, surtout si vous n'envisagez pas d'utiliser l'automatisation du navigateur. Cependant, une telle analyse prend du temps, parfois beaucoup.
Il convient également de noter que le temps consacré à l'analyse et à la recherche d'une solution d'exploration plus optimale n'est pas toujours payant : vous pourriez passer des heures pour découvrir que l'approche la plus évidente était toujours la meilleure.
Par conséquent, il est sage de fixer des limites à votre analyse initiale de site. Si vous ne voyez pas de meilleur chemin dans le temps imparti, revenez à des approches plus simples. Au fur et à mesure que vous gagnerez en expérience, vous serez plus souvent en mesure de déterminer dès le début, en fonction des technologies utilisées sur le site, si cela vaut la peine de consacrer plus de temps à l'analyse ou non.
De plus, dans les projets où vous devez extraire les données d'un site une seule fois, une analyse approfondie du site peut parfois éliminer complètement le besoin d'écrire du code scraper. Voici un exemple d'un tel site - https://ricebyrice.com/nl/pages/find-store.
En l'analysant, vous découvrirez facilement que toutes les données peuvent être obtenues avec une seule requête. Il vous suffit de copier ces données de votre navigateur dans un fichier JSON et votre tâche est terminée.
Lors de l'analyse d'un site, changez de tri, de page, interagissez avec divers éléments du site, tout en surveillant l'onglet Réseau dans les outils de développement de votre navigateur. Cela vous permettra de mieux comprendre comment le site interagit avec le backend, sur quel framework il est construit et quel comportement peut en attendre.
C'est évident, mais c'est important de le garder à l'esprit lorsque l'on travaille sur un projet. Si vous voyez des données ou des paramètres de requête, cela signifie qu'ils ont été obtenus quelque part plus tôt, peut-être dans une autre requête, peut-être qu'ils ont déjà été sur la page du site Web, peut-être qu'ils ont été formés en utilisant JS à partir d'autres paramètres. Mais ils sont toujours quelque part.
Si vous ne comprenez pas d'où proviennent les données de la page ou les données utilisées dans une requête, suivez ces étapes :
La pratique rend parfait ici. À mesure que vous vous familiariserez avec différentes technologies, divers frameworks et leurs comportements attendus, et à mesure que vous rencontrerez un large éventail de technologies, il vous sera plus facile de comprendre comment les choses fonctionnent et comment les données sont transférées. Ces connaissances accumulées amélioreront considérablement votre capacité à tracer et à comprendre les flux de données dans les applications Web.
Vous remarquerez peut-être qu'en ouvrant plusieurs fois la même page, les requêtes transmises au serveur diffèrent : peut-être que quelque chose a été mis en cache et est déjà stocké sur votre ordinateur. Par conséquent, il est recommandé d'analyser le site en mode navigation privée, ainsi que de changer de navigateur.
Cette situation est particulièrement pertinente pour les applications mobiles, qui peuvent stocker certaines données en stockage sur l'appareil. Par conséquent, lors de l'analyse des applications mobiles, vous devrez peut-être vider le cache et le stockage.
Si lors de l'analyse vous découvrez que le site utilise un framework que vous n'avez jamais rencontré auparavant, prenez le temps de vous renseigner sur celui-ci et ses fonctionnalités. Par exemple, si vous remarquez qu'un site est construit avec Next.js, comprendre comment il gère le routage et la récupération des données pourrait être crucial pour votre stratégie de scraping.
Vous pouvez en apprendre davantage sur ces frameworks via la documentation officielle ou en utilisant des LLM comme ChatGPT ou Claude. Ces assistants IA sont excellents pour expliquer les concepts spécifiques au framework. Voici un exemple de la façon dont vous pouvez interroger un LLM sur Next.js :
I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed? Restrictions: - Accompany your answers with code samples - Use this message as the main message for all subsequent responses - Reference only those elements that are available on the client side, without access to the project code base
Vous pouvez également créer des requêtes similaires pour les frameworks backend. Par exemple, avec GraphQL, vous pouvez poser des questions sur les champs disponibles et les structures de requête. Ces informations peuvent vous aider à comprendre comment mieux interagir avec l'API du site et quelles données sont potentiellement disponibles.
Pour un travail efficace avec LLM, je recommande au moins d'étudier les bases de l'ingénierie rapide.
Le Web scraping va de pair avec l’ingénierie inverse. Vous étudiez les interactions du frontend et du backend, vous devrez peut-être étudier le code pour mieux comprendre comment se forment certains paramètres.
Mais dans certains cas, l'ingénierie inverse peut nécessiter plus de connaissances, d'efforts, de temps ou avoir un degré élevé de complexité. À ce stade, vous devez décider si vous devez approfondir cette question ou s'il est préférable de modifier la source de données ou, par exemple, la technologie. Très probablement, ce sera le moment où vous déciderez d'abandonner le HTTP Web Scraping et de passer à un navigateur sans tête.
Le principe principal de la plupart des protections contre le web scraping n'est pas de rendre le web scraping impossible, mais de le rendre coûteux.
Regardons simplement à quoi ressemble la réponse à une recherche sur zoopla
Après avoir identifié les points de terminaison dont vous avez besoin pour extraire les données cibles, assurez-vous d'obtenir une réponse correcte lorsque vous faites une demande. Si vous obtenez une réponse du serveur autre que 200 ou des données différentes de celles attendues, vous devez comprendre pourquoi. Voici quelques raisons possibles :
Et bien d'autres raisons possibles, dont chacune nécessite une analyse séparée.
Explorez les résultats que vous obtenez lorsque vous modifiez les paramètres de la requête, le cas échéant. Certains paramètres peuvent être manquants mais pris en charge côté serveur. Par exemple, ordre, tri, par page, limite et autres. Essayez de les ajouter et voyez si le comportement change.
Ceci est particulièrement pertinent pour les sites utilisant graphql
Considérons cet exemple
Si vous analysez le site, vous verrez une requête qui peut être reproduite avec le code suivant, je l'ai un peu formaté pour améliorer la lisibilité :
I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed? Restrictions: - Accompany your answers with code samples - Use this message as the main message for all subsequent responses - Reference only those elements that are available on the client side, without access to the project code base
Je vais maintenant le mettre à jour pour obtenir des résultats en 2 langues à la fois, et surtout, avec le texte interne des publications :
import requests url = "https://restoran.ua/graphql" data = { "operationName": "Posts_PostsForView", "variables": {"sort": {"sortBy": ["startAt_DESC"]}}, "query": """query Posts_PostsForView( $where: PostForViewWhereInput, $sort: PostForViewSortInput, $pagination: PaginationInput, $search: String, $token: String, $coordinates_slice: SliceInput) { PostsForView( where: $where sort: $sort pagination: $pagination search: $search token: $token ) { id title: ukTitle summary: ukSummary slug startAt endAt newsFeed events journal toProfessionals photoHeader { address: mobile __typename } coordinates(slice: $coordinates_slice) { lng lat __typename } __typename } }""" } response = requests.post(url, json=data) print(response.json())
Comme vous pouvez le constater, une petite mise à jour des paramètres de la requête me permet de ne pas me soucier de visiter la page interne de chaque publication. Vous n'avez aucune idée combien de fois cette astuce m'a sauvé.
Si vous voyez graphql devant vous et que vous ne savez pas par où commencer, alors mes conseils sur la documentation et le LLM fonctionnent ici aussi.
Je sais à quel point il est facile de maîtriser quelques outils et de les utiliser simplement parce que cela fonctionne. Je suis moi-même tombé dans ce piège plus d'une fois.
Mais les sites modernes utilisent des technologies modernes qui ont un impact significatif sur le web scraping, et en réponse, de nouveaux outils de web scraping émergent. Les apprendre peut grandement simplifier votre prochain projet et peut même résoudre certains problèmes qui étaient insurmontables pour vous. J'ai écrit sur certains outils plus tôt.
Je recommande particulièrement de prêter attention à curl_cffi et aux frameworks
botasaurus et Crawlee pour Python.
Personnellement, je n’ai réalisé que récemment l’importance de cela. Tous les outils que j'utilise pour mon travail sont soit des développements open source, soit basés sur l'open source. Le web scraping vit littéralement grâce à l'open source, et cela est particulièrement visible si vous êtes un développeur Python et que vous avez réalisé que sur Python pur, tout est assez triste lorsque vous devez gérer l'empreinte digitale TLS, et encore une fois, l'open source nous a sauvés ici.
Et il me semble que le moins que nous puissions faire est d'investir un peu de nos connaissances et compétences dans le support de l'open source.
J'ai choisi de prendre en charge Crawlee pour Python, et non, non pas parce qu'ils m'ont permis d'écrire sur leur blog, mais parce qu'il montre une excellente dynamique de développement et vise à faciliter la vie des développeurs de robots d'exploration Web. Il permet un développement plus rapide des robots en prenant en charge et en cachant sous le capot des aspects critiques tels que la gestion des sessions, la rotation des sessions en cas de blocage, la gestion de la simultanéité des tâches asynchrones (si vous écrivez du code asynchrone, vous savez à quel point cela peut être pénible), et bien plus encore.
:::astuce
Si vous aimez le blog jusqu'à présent, pensez à donner une étoile à Crawlee sur GitHub, cela nous aide à atteindre et à aider davantage de développeurs.
:::
Et quel choix ferez-vous ?
Je pense que certaines choses dans l'article étaient évidentes pour vous, certaines choses que vous suivez vous-même, mais j'espère que vous avez aussi appris quelque chose de nouveau. Si la plupart d'entre elles étaient nouvelles, essayez d'utiliser ces règles comme liste de contrôle dans votre prochain projet.
Je serais heureux de discuter de l'article. N'hésitez pas à commenter ici, dans l'article, ou à me contacter dans la communauté des développeurs Crawlee sur Discord.
Vous pouvez également me retrouver sur les plateformes suivantes : Github, Linkedin, Apify, Upwork, Contra.
Merci de votre attention :)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!