Comment créer un robot d’exploration d’URL pour mapper un site Web en utilisant Python

par Ahad Sheriff

Un projet simple pour apprendre les bases du grattage Web

Avant de commencer, assurons-nous de comprendre ce qu’est le grattage Web:

Le grattage Web est le processus d’extraction de données à partir de sites Web pour les présenter dans un format que les utilisateurs peuvent facilement comprendre.

Dans ce tutoriel, je veux démontrer à quel point il est facile de créer un simple robot d’URL en Python que vous pouvez utiliser pour mapper des sites Web. Bien que ce programme soit relativement simple, il peut fournir une excellente introduction aux principes fondamentaux du grattage Web et de l’automatisation. Nous nous concentrerons sur l’extraction récursive de liens à partir de pages Web, mais les mêmes idées peuvent être appliquées à une myriade d’autres solutions.

Notre programme fonctionnera comme ceci:

  1. Visitez une page Web
  2. Grattez toutes les URL uniques trouvées sur la page Web et ajoutez-les à une file d’attente
  3. Traitez récursivement les URL une par une jusqu’à épuisement de la file d’attente
  4. Imprimer les résultats

Tout d’abord

La première chose que nous devrions faire est importez toutes les bibliothèques nécessaires. Nous utiliserons BeautifulSoup, requests et urllib pour le grattage Web.

from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque

Ensuite, nous devons sélectionner une URL à partir de laquelle commencer à explorer. Bien que vous puissiez choisir n’importe quelle page Web avec des liens HTML, je recommande d’utiliser ScrapeThisSite. C’est un bac à sable sûr que vous pouvez explorer sans avoir de problèmes.

url = "https://scrapethissite.com"

Ensuite, nous allons devoir créer un nouvel objet deque afin que nous puissions facilement ajouter des liens nouvellement trouvés et les supprimer une fois que nous avons fini de les traiter. Préremplissez le deque avec votre variable url:

# a queue of urls to be crawled nextnew_urls = deque()

Nous pouvons ensuite utiliser un ensemble pour stocker des URL uniques une fois qu’elles ont été traitées:

# a set of urls that we have already processed processed_urls = set()

Nous voulons également garder une trace des URL locales (même domaine que la cible), étrangères (domaine différent de la cible) et cassées:

# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()

Il est temps d’analyser

Avec tout cela en place, nous pouvons maintenant commencer à écrire le code réel pour explorer le site Web.

Nous voulons examiner chaque URL de la file d’attente, voir s’il y a des URL supplémentaires dans cette page et ajouter chacune à la fin de la file d’attente jusqu’à ce qu’il n’en reste plus aucune. Dès que nous aurons fini de gratter une URL, nous la supprimerons de la file d’attente et l’ajouterons à l’ensemble processed_urls pour une utilisation ultérieure.

# process urls one by one until we exhaust the queuewhile len(new_urls): # move url from the queue to processed url set url = new_urls.popleft() processed_urls.add(url) # print the current url print("Processing %s" % url)

Ensuite, ajoutez une exception pour intercepter les pages Web cassées et ajoutez-les à l’ensemble broken_urls pour une utilisation ultérieure:

try: response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema): # add broken urls to it's own set, then continue broken_urls.add(url) continue

Nous devons ensuite obtenir l’URL de base de la page Web afin de pouvoir facilement différencier les adresses locales et étrangères:

# extract base url to resolve relative linksparts = urlsplit(url)base = "{0.netloc}".format(parts)strip_base = base.replace("www.", "")base_url = "{0.scheme}://{0.netloc}".format(parts)path = url if '/' in parts.path else url

Initialisez BeautifulSoup pour traiter le document HTML:

soup = BeautifulSoup(response.text, "lxml")

Maintenant, grattez la page Web pour tous les liens et triez-les pour les ajouter à leur ensemble correspondant:

for link in soup.find_all('a'): # extract link url from the anchor anchor = link.attrs if "href" in link.attrs else ''
if anchor.startswith('/'): local_link = base_url + anchor local_urls.add(local_link) elif strip_base in anchor: local_urls.add(anchor) elif not anchor.startswith('http'): local_link = path + anchor local_urls.add(local_link) else: foreign_urls.add(anchor)

Puisque je souhaite limiter mon robot d’exploration aux adresses locales uniquement, j’ajoute ce qui suit pour ajouter de nouvelles URL à notre file d’attente:

for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)

Si vous souhaitez analyser toutes les URL, utilisez:

if not link in new_urls and not link in processed_urls: new_urls.append(link)

Avertissement: La façon dont le programme fonctionne actuellement, l’exploration des URL étrangères prendra beaucoup de temps. Vous pourriez avoir des ennuis pour avoir gratté des sites Web sans autorisation. Utilisez-le à vos risques et périls!

Exemple de sortie

Voici tout mon code:

Et ça devrait être ça. Vous venez de créer un outil simple pour explorer un site Web et cartographier toutes les URL trouvées!

En conclusion

N’hésitez pas à développer et à améliorer ce code. Par exemple, vous pouvez modifier le programme pour rechercher sur les pages Web des adresses e-mail ou des numéros de téléphone au fur et à mesure que vous les parcourez. Vous pouvez même étendre les fonctionnalités en ajoutant des arguments de ligne de commande pour fournir la possibilité de définir des fichiers de sortie, de limiter les recherches à la profondeur, et bien plus encore. Découvrez comment créer des interfaces de ligne de commande pour accepter des arguments ici.

Write a Comment

Votre adresse e-mail ne sera pas publiée.