Comment créer un robot d'exploration du Web en utilisant Python - Guide du débutant
Ștefan Răcila le 11 avril 2023

L'exploration du web est le processus qui consiste à visiter automatiquement des pages web et à en extraire des informations utiles. Un robot d'exploration, également connu sous le nom de "spider" ou "bot", est un programme qui effectue cette tâche. Dans cet article, nous verrons comment créer un robot d'exploration à l'aide du langage de programmation Python. Plus précisément, nous allons créer deux robots d'indexation.
Nous allons construire un simple crawler web à partir de zéro en Python en utilisant les bibliothèques Requests et BeautifulSoup . Ensuite, nous parlerons des avantages de l'utilisation d'un framework de crawling web comme Scrapy. Enfin, nous construirons un exemple de crawler avec Scrapy pour collecter des données sur tous les produits pour bébés d'Amazon. Nous verrons également comment Scrapy s'adapte à des sites web de plusieurs millions de pages.
Conditions préalables
Avant de suivre cet article, vous devez avoir une compréhension de base de Python et l'avoir installé sur votre ordinateur. De plus, vous devrez installer les modules Requests et BeautifulSoup. Cela peut être fait en lançant la commande suivante dans votre invite de commande ou votre terminal :
pip install requests bs4
Pour la deuxième partie de cet article, où nous allons construire un exemple de robot d'exploration de sites web en utilisant Scrapy, vous aurez besoin d'installer le framework Scrapy. Les créateurs de ce framework recommandent fortement d'installer Scrapy dans un environnement virtuel dédié, afin d'éviter tout conflit avec les paquets de votre système.
Je vous suggère d'installer virtualenv et virtualenvwrapper pour créer un environnement Python isolé. Veuillez noter qu'il existe une version de virtualenvwrapper pour Windows appelée virtualenvwrapper-win.
Vous devrez également installer pipx via pip pour installer virtualenv.
$ python -m pip install --user pipx
$ python -m pipx ensurepath
Après avoir créé un environnement Python isolé, vous pouvez installer Scrapy avec la commande suivante.
pip install Scrapy
Vous pouvez trouver le guide d'installation de Scrapy ici.
Qu'est-ce qu'un robot d'indexation ?
L'exploration et le grattage du web sont des concepts liés mais distincts. Le web scraping est le processus global d'extraction de données d'un site web. L'exploration du web est la tâche spécifique qui consiste à naviguer automatiquement à travers les pages web pour trouver les URL qui doivent être explorées.
Un robot d'indexation commence par une liste d'URL à parcourir, appelée "seed". En parcourant chaque URL, il recherche des liens dans le code HTML et les filtre en fonction de critères spécifiques. Tous les nouveaux liens trouvés sont ajoutés à une file d'attente en vue d'un traitement ultérieur. Le code HTML extrait ou les informations spécifiées sont ensuite transmis à un autre pipeline en vue d'un traitement ultérieur.
Lors de la création d'un robot d'exploration, il est important de garder à l'esprit que toutes les pages d'un site web ne seront pas visitées. Le nombre de pages visitées dépend du budget du crawler, de la profondeur du crawling ou du temps alloué à l'exécution.
De nombreux sites web disposent d'un fichier robots.txt qui indique les parties du site qui peuvent être explorées et celles qui doivent être évitées. En outre, certains sites web disposent d'un fichier sitemap.xml qui est plus explicite que le fichier robots.txt et indique spécifiquement aux robots quelles pages doivent être explorées, et fournit des métadonnées supplémentaires pour chaque URL.
Les robots d'indexation sont couramment utilisés à des fins diverses :
- Les outils d'analyse SEO collectent des métadonnées telles que le temps de réponse et l'état de la réponse, en plus du code HTML pour détecter les pages cassées et les liens entre différents domaines pour collecter des backlinks.
- Les outils de surveillance des prix parcourent les sites de commerce électronique pour trouver les pages de produits et en extraire les métadonnées, en particulier les prix. Les pages de produits sont ensuite revisitées périodiquement.
- Les moteurs de recherche, tels que Googlebot, Bingbot et Yandex Bot, collectent tout le code HTML d'une grande partie du web et utilisent ces données pour effectuer des recherches.
Dans la suite de cet article, nous comparerons deux approches différentes pour construire un robot d'exploration du web en Python. La première approche consiste à utiliser la bibliothèque Requests pour effectuer des requêtes HTTP et BeautifulSoup pour analyser le contenu HTML. La seconde approche consiste à utiliser un framework de crawling web. Nous utiliserons Scrapy.
Utilisation des bibliothèques Requests et BeautifulSoup
Le module requests de Python est un outil puissant pour effectuer des requêtes HTTP. Pour l'utiliser dans le cadre de l'exploration du web, vous pouvez commencer par importer le module et envoyer une requête à une URL spécifique. En voici un exemple :
url = 'https://amazon.com/s?k=baby+produits'
response = requests.get(url)
Une fois que vous avez la réponse, vous pouvez extraire tous les liens du contenu HTML en utilisant BeautifulSoup. Par exemple, vous pouvez extraire tous les liens du contenu HTML à l'aide de BeautifulSoup :
import json
from urllib.parse import urljoin
from bs4 import BeautifulSoup
html = response.text
links = []
soup = BeautifulSoup(html, 'html.parser')
for link in soup.find_all('a') :
path = link.get('href')
if path and path.startswith('/') :
path = urljoin(url, path)
links.append(path)
print(json.dumps(links, sort_keys = True, indent = 2))
Vous pouvez ensuite parcourir les liens et leur adresser des requêtes, en répétant le processus jusqu'à ce que vous ayez visité toutes les pages que vous souhaitez explorer. Il s'agit d'une fonction récursive qui agit de la même manière :
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
import logging
logging.basicConfig(
format='%(asctime)s %(levelname)s:%(message)s',
level=logging.INFO)
url = 'https://amazon.com/s?k=baby+products'
visited = []
def crawl(url):
logging.info(f'Crawling: {url}')
visited.append(url)
html = ''
try:
html = requests.get(url).text
except Exception:
logging.exception(f'Failed to crawl: {url}')
return
soup = BeautifulSoup(html, 'html.parser')
# here you can extract and store useful data from the page
for link in soup.find_all('a'):
path = link.get('href')
if path and path.startswith('/'):
path = urljoin(url, path)
if path not in visited:
crawl(path)
crawl(url)
La fonction enregistre une ligne pour chaque URL visitée.
2023-01-16 09:20:51,681 INFO:Crawling : https://amazon.com/s?k=baby+produits
2023-01-16 09:20:53,053 INFO:Crawling : https://amazon.com/ref=cs_503_logo
2023-01-16 09:20:54,195 INFO:Crawling : https://amazon.com/ref=cs_503_link
2023-01-16 09:20:55,131 INFO:Crawling : https://amazon.com/dogsofamazon/ref=cs_503_d
2023-01-16 09:20:56,549 INFO:Crawling : https://www.amazon.com/ref=nodl_ ?nodl_android
2023-01-16 09:20:57,071 INFO:Crawling : https://www.amazon.com/ref=cs_503_logo
2023-01-16 09:20:57,690 INFO:Crawling : https://www.amazon.com/ref=cs_503_link
2023-01-16 09:20:57,943 INFO:Crawling : https://www.amazon.com/dogsofamazon/ref=cs_503_d
2023-01-16 09:20:58,413 INFO:Crawling : https://www.amazon.com.au/ref=nodl_&nodl_android
2023-01-16 09:20:59,555 INFO:Crawling : None
2023-01-16 09:20:59,557 ERROR:Échec de l'exploration : Aucun
Bien que le code d'un robot d'exploration de base puisse sembler simple, de nombreux défis doivent être relevés afin d'explorer avec succès un site web entier. Il s'agit notamment des questions suivantes
- La logique de l'URL de téléchargement manque d'un mécanisme de relance et la file d'attente d'URL n'est pas très efficace avec un grand nombre d'URL.
- Le crawler ne s'identifie pas et ignore le fichier robots.txt.
- Le crawler est lent et ne prend pas en charge le parallélisme. Chaque URL prend environ une seconde et le crawler attend une réponse avant de passer à l'URL suivante.
- La logique d'extraction des liens ne permet pas de normaliser les URL en supprimant les paramètres de la chaîne de requête, ne gère pas les URL d'ancrage/fragment relatifs (tels que href="#anchor") et ne permet pas de filtrer les URL par domaine ou de filtrer les requêtes vers des fichiers statiques.
Dans la section suivante, nous verrons comment Scrapy résout ces problèmes et facilite l'extension des fonctionnalités du moteur de recherche pour des cas d'utilisation personnalisés.
Comment créer un robot d'indexation en Python en utilisant le framework Scrapy
Scrapy est un cadre puissant pour créer des robots d'indexation en Python. Il fournit un moyen intégré de suivre les liens et d'extraire des informations des pages web. Vous devrez créer un nouveau projet Scrapy et un spider pour définir le comportement de votre crawler.
Avant de commencer à explorer un site web comme Amazon, il est important de vérifier le fichier robots.txt du site web pour voir quels chemins d'URL sont autorisés. Scrapy lit automatiquement ce fichier et le suit lorsque le paramètre ROBOTSTXT_OBEY est fixé à true, ce qui est le cas par défaut pour les projets créés à l'aide de la commande Scrapy `startproject`.
Pour créer un nouveau projet Scrapy, vous devez exécuter la commande suivante :
scrapy startproject amazon_crawler
Cette commande génère un projet avec la structure suivante :
amazon_crawler/
├── scrapy.cfg
└── amazon_crawler
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
├── __init__.py
Pour créer une araignée, utilisez la commande `genspider` du CLI de Scrapy. La commande a la définition suivante :
$ scrapy genspider [options] <name> <domain>
Pour générer un spider pour ce crawler, nous pouvons exécuter :
$ cd amazon_crawler
$ scrapy genspider baby_products amazon.com
Il devrait créer un fichier nommé `baby_products.py` dans le dossier nommé `spiders` et générer ce code :
import scrapy
class BabyProductsSpider(scrapy.Spider) :
name = 'wikipedia'
allowed_domains = ['en.wikipedia.com']
start_urls = ['http://en.wikipedia.com/']
def parse(self, response) :
pass
Scrapy propose également une variété de classes d'araignées prédéfinies, telles que CrawlSpider, XMLFeedSpider, CSVFeedSpider et SitemapSpider. La classe CrawlSpider, qui est construite au-dessus de la classe Spider de base, comprend un attribut "rules" supplémentaire pour définir la manière de naviguer sur un site web. Chaque règle utilise un LinkExtractor pour déterminer les liens à extraire de chaque page.
Pour notre cas d'utilisation, nous devrions hériter notre classe Spider de CrawlSpider. Nous devrons également créer une règle LinkExtractor qui indique au crawler de n'extraire que les liens de la pagination d'Amazon. N'oubliez pas que notre objectif est de collecter des données sur tous les produits pour bébés d'Amazon, nous ne voulons donc pas suivre tous les liens que nous trouvons sur la page.
Ensuite, nous devons créer deux autres méthodes dans notre classe, `parse_item` et `parse_product`. `parse_item` sera donnée comme fonction de rappel à notre règle LinkExtractor et sera appelée avec chaque lien extrait. `parse_product` analysera chaque produit... ¯\_(ツ)_/¯
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
class BabyProductsSpider(CrawlSpider):
name = 'baby_products'
allowed_domains = ['amazon.com']
start_urls = ['https://amazon.com/s?k=baby+products']
rules = (
Rule(
LinkExtractor(
restrict_css='.s-pagination-strip'
),
callback='parse_item',
follow=True),
)
def parse_item(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
products = soup.select('div[data-component-type="s-search-result"]')
data = []
for product in products:
parsed_product = self.parse_product(product)
if (parsed_product != 'error'):
data.append(parsed_product)
return {
'url': response.url,
'data': data
}
def parse_product(self, product):
try:
link = product.select_one('a.a-text-normal')
price = product.select_one('span.a-price > span.a-offscreen').text
return {
'product_url': link['href'],
'name': link.text,
'price': price
}
except:
return 'error'
Pour démarrer le crawler, vous pouvez courir :
scrapy crawl baby_products
Vous verrez de nombreux journaux dans la console (vous pouvez spécifier un fichier journal avec `--logfile [log_file_name]`).
J'ai utilisé Amazon Search comme exemple pour démontrer les bases de la création d'un crawler web en Python. Cependant, le crawler ne trouve pas beaucoup de liens à suivre et n'est pas adapté à un cas d'utilisation spécifique des données. Si vous cherchez à extraire des données spécifiques d'Amazon Search, vous pouvez envisager d'utiliser notre API Amazon Product Data. Nous avons créé des analyseurs personnalisés pour Amazon Search, les pages de produits et de catégories et nous renvoyons les données au format JSON, prêtes à être utilisées dans votre application.
Pourquoi est-il préférable d'utiliser un service de scraping professionnel plutôt qu'un crawler ?
Si l'exploration du web peut être un outil utile pour extraire des données de l'internet, elle peut aussi prendre du temps et être complexe à mettre en place. En outre, le web scraping peut aller à l'encontre des conditions de service de certains sites web et peut entraîner le blocage de votre IP, voire des poursuites judiciaires à votre encontre.
En revanche, les services de scraping professionnels utilisent des techniques et des technologies avancées pour contourner les mesures anti-scraping et extraire des données sans être détectés. Ils s'occupent également de la maintenance et de la mise à l'échelle de l'infrastructure de scraping, ce qui vous permet de vous concentrer sur l'analyse et l'utilisation des données. En outre, ils offrent un niveau plus élevé de précision et d'exhaustivité des données car ils sont capables de traiter des cas d'utilisation d'extraction de données plus avancés et de gérer des travaux de scraping à grande échelle.
Résumé
En conclusion, si l'exploration du web peut être un outil utile pour extraire des données de l'internet, elle peut aussi prendre du temps et être complexe à mettre en place. En outre, l'exploration du web peut aller à l'encontre des conditions de service de certains sites web et peut entraîner le blocage de votre IP, voire des poursuites judiciaires à votre encontre. Par conséquent, pour des travaux de scraping plus avancés et à plus grande échelle, il est préférable de faire appel à un service de scraping professionnel.
Si vous cherchez une alternative au crawling par vos propres moyens, envisagez d'utiliser WebScrapingAPI. WebScrapingAPI est un service professionnel de web scraping qui vous permet d'extraire facilement des données de sites web sans avoir besoin de construire et de maintenir votre propre web scraper.
Il s'agit d'une solution rapide, fiable et rentable qui convient aux entreprises de toutes tailles.
Pourquoi ne pas l 'essayer dès aujourd'hui? C'est gratuit et nous proposons une période d'essai de 14 jours sans carte.
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.


Apprenez à récupérer des sites web dynamiques en JavaScript à l'aide de Scrapy et de Splash. De l'installation à l'écriture d'un spider, en passant par la gestion de la pagination et des réponses Splash, ce guide complet propose des instructions pas à pas pour les débutants comme pour les experts.


Découvrez une comparaison détaillée entre Scrapy et Beautiful Soup, deux outils de scraping web de premier plan. Comprenez leurs caractéristiques, leurs avantages et leurs inconvénients, et découvrez comment ils peuvent être utilisés ensemble pour répondre aux besoins de différents projets.
