Bon, nous pouvons maintenant écrire du code !
Commencez par ouvrir une fenêtre de terminal dans votre IDE et exécutez la commande suivante, qui installera BeautifulSoup, une bibliothèque qui nous aidera à extraire les données du code HTML :
> pip install beautifulsoup4
Créez ensuite un dossier nommé « products ». Cela vous aidera à organiser et à stocker les résultats du scraping dans plusieurs fichiers CSV.
Enfin, créez le fichier « crawler.py ». C'est là que nous allons écrire tout notre code et notre logique de crawling. Une fois que nous avons terminé, nous pouvons exécuter le fichier à l'aide de la commande suivante :
> py crawler.py
Passons maintenant à l'importation des bibliothèques dont nous avons besoin, puis définissons quelques variables globales :
import requests
from bs4 import BeautifulSoup
import csv
BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION
ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"
Définissons maintenant le point d'entrée de notre crawler :
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup, filename)
crawl(FULL_START_URL, 'etee-page1.txt')
Nous implémentons la fonction crawl, qui extraira les documents HTML via notre procédure get_page_source. Elle créera ensuite l’objet BeautifulSoup qui facilitera notre analyse et appellera la fonction start_crawling, qui commencera à parcourir le site web.
def get_page_source(url, filename):
params = {
"api_key": API_KEY,
"url": url,
"render_js": '1'
}
page = requests.request("GET", ENDPOINT, params=params)
soup = BeautifulSoup(page.content, 'html.parser')
body = soup.find('body')
file_source = open(filename, mode='w', encoding='utf-8')
file_source.write(str(body))
file_source.close()
return str(body)
Comme indiqué précédemment, la fonction get_page_source utilisera WebScrapingAPI pour récupérer le contenu HTML du site web et l'écrira dans un fichier texte dans la section <body>, car c'est celle qui contient toutes les informations qui nous intéressent.
Maintenant, prenons un peu de recul et voyons comment atteindre nos objectifs. Les produits sont organisés en pages, nous devons donc accéder à chaque page à plusieurs reprises pour tous les extraire.
Cela signifie que notre robot d'indexation suivra des étapes récursives tant qu'il y aura des pages disponibles. Pour traduire cette logique en code, nous devons examiner comment le code HTML décrit ces conditions.
Si vous revenez à la console de développement, vous pouvez voir que chaque numéro de page est en fait un lien vers une nouvelle page. De plus, étant donné que nous sommes sur la première page et qu'il n'y en a pas d'autre avant celle-ci, la flèche gauche est désactivée.
L'algorithme suivant doit donc :
- Accéder à la page ;
- Extraire les données (nous implémenterons cela à l'étape suivante) ;
- Trouver le conteneur de pagination dans le document HTML ; Vérifier si la flèche « Page suivante » est désactivée, s'arrêter si c'est le cas et, si ce n'est pas le cas, récupérer le nouveau lien et appeler la fonction de crawl pour la nouvelle page.
def start_crawling(soup, filename):
extract_products(soup, filename)
pagination = soup.find('ul', {'class': 'pagination-custom'})
next_page = pagination.find_all('li')[-1]
if next_page.has_attr('class'):
if next_page['class'] == ['disabled']:
print("You reached the last page. Stopping the crawler...")
else:
next_page_link = next_page.find('a')['href']
next_page_address = BASE_URL + next_page_link
next_page_index = next_page_link[next_page_link.find('=') + 1]
crawl(next_page_address, f'etee-page{next_page_index}.txt')