Les défis du scraping
Adaptation à la dynamique des sites web
(modification / suppression de
contenu),
Contenu généré par JavaScript ,
Gestion des politiques de robots.txt ,
Politesse du scraper (ne pas surcharger les
serveurs du site).
Difficulté d'extraire des données : Les sites Web sont souvent conçus pour être
attrayants pour les
humains, pas pour être faciles à naviguer pour les robots. Ils peuvent avoir des
structures
de pages
complexes, du contenu généré par JavaScript, ou des stratégies pour déjouer le scraping.
Performance : Le Web Crawling et le Web Scraping peuvent être des processus
intensifs
en
ressources, en particulier lorsqu'ils sont effectués à grande échelle. Il est essentiel
de
gérer
efficacement les ressources pour éviter de surcharger le serveur du site Web ou votre
propre
système.
Respect de la politesse du robot : Il est important de respecter les directives
du
fichier
robots.txt d'un site et de ne pas surcharger un site avec trop de requêtes en peu de
temps.
Tag soup
De nombreux documents HTML du Web datent d'avant HTML 4.01
De nombreuses pages Web ne respectent pas strictement un des
standards
Les navigateurs ne respectent pas strictement un des standards
$\rightarrow$ tag soup !
Appliquer des heuristiques pour interpréter les pages
De nombreux documents HTML du Web datent d'avant HTML 4.01.
En pratique :
De nombreuses pages Web ne respectent pas strictement un des standards.
Les navigateurs ne respectent pas strictement un des standards.
$\rightarrow$ tag soup !
Lorsqu'on exploite des pages Web, il est nécessaire d'appliquer des heuristiques pour
interpréter les
pages
Quiz
Lequel des énoncés suivants décrit le mieux les conséquences potentielles de la présence de tag
soup sur un site web ou une application web ?
a) Elle enfreint les normes du
web, mais n'a pas d'autres conséquences fonctionnelles car les navigateurs modernes
compensent très bien les balises mal formées.
b) Elle peut entraîner des
problèmes d'accessibilité, des problèmes d'indexation par les moteurs de recherche et des
comportements de rendu inattendus sur différents navigateurs et appareils, mais n'a pas
d'incidence directe sur les performances.
c) Tout en rendant la base de code
plus difficile à maintenir, le principal inconvénient du tag soup est de dégrader les
performances en augmentant le temps d'analyse et la surcharge de mémoire pour le
navigateur.
d) Le tag soup crée un risque
élevé de déclencher des vulnérabilités de sécurité en permettant des attaques par injection,
en plus de causer des perturbations de rendu et de limiter la capacité de styliser le
contenu avec CSS.
Réponses: 0
, a, b, c, d
, 0, 0, 0, 0
Quiz
Lequel des extraits suivants est mal formé :
<p>This is a well-formed fragment of <em>HTML.</p></em>
<p>This is a well-formed fragment of <em>HTML</em>.</p>
Les deux.
Réponses: 0
Analyse de page
Du très empirique…
fragile dans le temps si la page évolue
Au très sophistiqué
Règles d'analyse
Analyses linguistiques ou sémantiques
Apprentissage
Cas particuliers
Recherche de suites de mots
Recherche d'un "motif" à partir de regex
Du très empirique…
Ex: Récupérer le contenu du 1er paragraphe du 3eme div
Pb: fragile dans le temps si la page évolue
Au très sophistiqué
Identification de régularités sur des séries de page et définition
automatisée de règles d'analyse
Analyses linguistiques ou sémantiques
Apprentissage
Cas particuliers
Recherche de suites de mots à partir d'un répertoire de référence
Recherche d'un 'motif' à partir d'expressions régulières (regular
expression)
Récupérer le code HTML d'une page
from urllib.request import urlopen
url = "https://fr.wikipedia.org/wiki/The_Thing_(film,_1982)"
page = urlopen(url)
html_bytes = page.read()
html = html_bytes.decode("utf-8")
Méthodes de string
start_index = title_index + len("<title>")
end_index = html.find("</title>")
title = html[start_index:end_index]
Quiz
En appliquant la méthode précédente quel est le résultat obtenu ?
<head>
<title >Mon super site</title>
</head>
Méthodes de string
Ces problèmes peuvent survenir de manière imprévisible et innombrable .
Vous avez besoin d'un moyen plus fiable pour extraire du texte de HTML.
Regex
Définition
Une regex est une chaîne de caractères qui décrit, selon une syntaxe précise, un ensemble de
chaînes de caractères possibles.
import re
pattern = "<title.*?>.*?</title.*?>"
match_results = re.search(pattern, html, re.IGNORECASE)
title = match_results.group()
title = re.sub("<.*?>", "", title) # Remove HTML tags
Bien que les expressions régulières soient très utiles pour la recherche
de motifs en général, il est parfois plus facile d'utiliser un parseur
HTML qui est explicitement conçu pour traiter les pages HTML.
BeautifulSoup
Bibliothèque Python pour parser le HTML et le XML.
Arbre de parsing à partir de la page.
Extraction de données.
Démo
BeautifulSoup est une bibliothèque Python qui est utilisée pour parser le HTML et le XML. Elle
crée un arbre de parsing à partir de la page, qui peut ensuite être utilisé pour extraire les
données.
BeautifulSoup
Avantages :
Facile à utiliser.
Excellent pour le parsing de HTML et de XML.
Méthodes simples pour naviguer, rechercher et modifier l'arbre de
parsing.
Inconvénients :
Ne télécharge pas les pages web.
Lent.
Avantages :
BeautifulSoup est facile à utiliser pour les débutants.
Il est excellent pour le parsing de HTML et de XML.
Il offre des méthodes simples pour naviguer, rechercher et modifier l'arbre de parsing.
Inconvénients :
BeautifulSoup ne télécharge pas les pages web, vous devrez utiliser une autre librairie
comme requests pour le faire.
Il n'est pas aussi rapide que Scrapy pour le crawling.
Installation de BeautifulSoup
En utilisant pip
:
python -m pip install beautifulsoup4
Usage :
from bs4 import BeautifulSoup
from urllib.request import urlopen
url = "https://fr.wikipedia.org/wiki/The_Thing_(film,_1982)"
page = urlopen(url)
html = page.read().decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
Ce programme fait trois choses :
Il ouvre l'URL en utilisant urlopen()
du module
urllib.request
.
Il lit le code HTML de la page sous forme de chaîne et l'affecte à la variable html.
Il crée un objet BeautifulSoup et l'affecte à la variable soup.
Vous pouvez utiliser find_all()
pour retourner une liste de toutes les instances d'un
tag particulier :
>>> soup.find_all("img")
[<img src="/static/images/icons/wikipedia.png"/>, ...]
Chaque objet Tag
possède une propriété .name
qui
renvoie une chaîne de caractères contenant le type de balise HTML :
>>> image1 = soup.find_all("img")[0]
>>> image1.name
'img'
>>> # Vous pouvez accéder aux attributs HTML de
>>> # l'objet Tag en plaçant leurs noms entre crochets
>>> image1["src"]
'/static/images/icons/wikipedia.png'
Certaines balises des documents HTML sont accessibles par les propriétés de l'objet Tag.
>>> soup.title
The Thing (film, 1982) — Wikipédia
>>> soup.title.string
'The Thing (film, 1982) — Wikipédia'
L'une des caractéristiques de Beautiful Soup est la possibilité de rechercher
des types de balises spécifiques dont les attributs correspondent à certaines
valeurs.
>>> soup.find_all("img", src="my_image.png")
[<img src="my_image.png"/>]
Notez bien que Beautiful Soup nettoie automatiquement les balises pour vous en supprimant, par
exemple, les espaces supplémentaires dans la balise d'ouverture ou les barres obliques (/) dans
la balise de fermeture.
Cette commande renvoie une liste de toutes les balises <img>
du document
HTML. Les objets de la liste semblent être des chaînes de caractères représentant les balises,
mais il s'agit en fait d'instances de l'objet Tag fourni par Beautiful Soup. Les objets Tag
fournissent une interface simple pour travailler avec les informations qu'ils contiennent.