Nous pouvons maintenant commencer à écrire le code. Pour créer notre robot d'indexation, nous suivrons un flux récursif afin d'accéder à tous les liens que nous rencontrerons. Mais commençons par définir notre point d'entrée :
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup)
crawl(FULL_START_URL, 'ecoroots.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 syntaxique et appellera la fonction start_crawling, qui lancera la navigation sur le site web.
def get_page_source(url, filename):
driver.get(url)
soup = BeautifulSoup(driver.page_source, '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 Selenium pour récupérer le contenu HTML du site web et l'écrira dans un fichier texte au niveau de la section <body>, car c'est celle qui contient tous les liens internes qui nous intéressent.
unique_links = {}
def start_crawling(soup):
links = soup.find_all(lambda tag: is_internal_link(tag))
for link in links:
link_href = link.get('href')
if not link_href in unique_links.keys() or unique_links[link_href] == 0:
unique_links[link_href] = 0
link_url = BASE_URL + link_href
link_filename = link_href.replace(SECTION + '/products/', '') + '.txt'
crawl(link_url, link_filename)
unique_links[link_href] = 1
C'est la logique principale du crawler. Une fois qu'il aura reçu l'objet BeautifulSoup, il extraira tous les liens internes. Nous effectuons cette opération à l'aide d'une fonction lambda, avec quelques conditions que nous avons définies dans la fonction is_internal_link :
def is_internal_link(tag):
if not tag.name == 'a': return False
if tag.get('href') is None: return False
if not tag.get('href').startswith(SECTION + '/products'): return False
return True
Cela signifie que pour chaque élément HTML rencontré, nous vérifions d’abord s’il s’agit d’une balise <a>, s’il possède un attribut href, puis si la valeur de cet attribut href correspond à un lien interne.
Une fois que nous avons la liste des liens, nous parcourons chacun d'entre eux, construisons l'URL complète et extrayons le nom du produit. Avec ces nouvelles données, nous disposons d'un nouveau site web que nous transmettons à la fonction de crawl depuis notre point d'entrée, de sorte que le processus recommence depuis le début.
Mais que se passe-t-il si nous rencontrons un lien que nous avons déjà visité ? Comment éviter un cycle sans fin ? Eh bien, pour cette situation, nous disposons de la structure de données unique_links. Pour chaque lien que nous parcourons, nous vérifions s’il a déjà été consulté avant de commencer à l’explorer. S’il s’agit d’un nouveau lien, nous le marquons simplement comme visité une fois l’exploration terminée.
Une fois votre script lancé, le crawler commencera à parcourir les produits du site web. Cela peut prendre quelques minutes selon la taille du site web que vous avez choisi. À la fin, vous devriez disposer d’un ensemble de fichiers texte contenant le code HTML de chaque page visitée par votre crawler.