Scraping et APIs Web

Le Web scraping

Le Web scraping

Utilisations courantes

Collecte de données dans le domaine du data mining (analyse plus approfondie).
  • la veille concurrentielle,
  • l'agrégation de données de médias sociaux,
  • le recrutement,
  • la collecte de données de produits pour la comparaison de prix,
  • création de graphes de connaissances...

Un processus simple en apparence

  1. Obtenir le contenu HTML de la page Web
  2. Extraire les données souhaitées
  3. Stocker les données extraites
  4. Répéter le processus pour d'autres pages

Attention !

Il ne faut pas confondre le Web Scraping avec le Web Crawling.
no

Différences entre Web Crawling et Web Scraping

Portée
  • Web crawling $\rightarrow$ indexer un site complet (ou le Web)
  • Web scraping $\rightarrow$ extraire des informations spécifiques

Différences entre Web Crawling et Web Scraping

Profondeur
  • Web crawling $\rightarrow$ suit les liens de page en page
  • Web scraping $\rightarrow$ fonctionne au niveau de l'élément

Différences entre Web Crawling et Web Scraping

Outils
  • Web crawling $\rightarrow$ outils complexes (navigation + quantité de données)
  • Web scraping $\rightarrow$ plus simples (extraction de données HTML)

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).

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 !

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 ?





Réponses: 0

Quiz

Lequel des extraits suivants est mal formé :




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

L'éthique et la légalité

Considérations éthiques du Web Scraping

  • Privacy
  • Respect des conditions d'utilisation
  • Intégrité des données

Légalité du Web Scraping

  • Loi sur la fraude et l'abus informatiques (CFAA aux États-Unis)
  • Règlement général sur la protection des données (RGPD en Europe)
  • Lois sur le droit d'auteur

Licences

Jungle complexe :
  • Licences propriétaires
  • Licence de marque commerciale
  • Licence open source
    • Avec copyleft
      • Licence Art Libre, Licence CeCILL, CC-BY-SA, GFDL, GPL, LGPL, ODbL
    • Sans copyleft
      • Licence BSD, Licence CC-BY, Licence X11

LinkedIn vs hiQ Labs

  1. hiQ Labs collectaient des données en grattant les profils publics de LinkedIn.
  2. LinkedIn a bloqué les outils de hiQ Labs.
  3. hiQ Labs a déposé une plainte en 2017.
  4. Le tribunal a conclu que hiQ avait "probablement raison".
  5. La 9ème cour d'appel des États-Unis a confirmé l'injonction de hiQ en septembre 2019​​.
Linkedin
VS
hiQ Labs

Outils

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


						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

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.

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")
					
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"/>]
						
					

Les Web APIs

Types de sources de données sur le Web

  • Web classique (voir cours HTML)
    • Pages Web HTML
    • Pages dynamiques
  • Dont négociation de contenu
    • Autres types de contenus (voir cours NLP)
  • PDF, Gif, fichiers txt…
  • Pages Web sémantique (voir prochain cours)
  • APIs, Web Services
  • OpenData

Web Services

  • Logiciel accessible via HTTP/HTTPS.
  • Utilise des protocoles comme GraphQL, SOAP ou REST.
  • Emploie des méthodes standards : GET, POST, PUT, DELETE.
  • Formats de données indépendants : XML, JSON.

Avantages des services Web

  • Accessible où le Web est disponible.
  • Services partagés entre applications.
  • Composition de services avancés.
  • Profite d'une infrastructure réseau solide.

REST: Representational state transfer

  • Style d'architecture pour systèmes distribués, non un protocole ou format.
  • Basé sur la thèse de Roy Fielding.
  • Principes :
    • Utilisation de l'URI pour l'accès au service.
    • Exploitation des fonctions HTTP : GET, PUT, POST, DELETE.
    • Les codes de statut HTTP
    • Fonctionnement sans état.

REST: Fonctionnement sans état

  • Pas de stockage d'information entre requêtes.
  • Réduit la charge du serveur.
  • Facilite le débogage et la répartition de la charge.

Avantages de REST

  • Facile à implémenter, particulièrement pour les développeurs web.
  • Intégration fluide avec HTTP.
  • Utilisation de caches via l'association URL/ressource.

GraphQL

  • Langage de requête pour les API.
  • Alternative efficace à REST.
  • Créé par Facebook en 2015, open source.

Caractéristiques de GraphQL

  • Un seul point de terminaison.
  • Structure de requête définie par le client.
  • Permet des requêtes complexes.
  • Réduit le sur- et sous-chargement de données.

OpenData

  • Données librement disponibles pour tous.
  • Utilisé pour augmenter la transparence et favoriser l'innovation.
  • Formats communs : CSV, JSON, XML.
Vous pouvez trouver des jeux de données sur le site du gouvernement : data.gouv.fr

API Web

On parle souvent d'API Web pour les services accessibles sur Internet

FastAPI

  • Un framework moderne, rapide (haute performance) pour construire des API avec Python 3.6+ basé sur des standards comme OpenAPI et JSON Schema.
  • Asynchrone et prêt pour la production.
pip install fastapi[all]

Pourquoi FastAPI ?

  • Performance : Comparable à Node.js et Go grâce à Starlette et Pydantic.
  • Rapide à coder : Réduit jusqu'à 40 % les erreurs humaines grâce à un système de type strict.
  • Facile à apprendre : Code minimaliste et documentation claire.
  • Génère une documentation interactive : Intégration automatique de Swagger UI pour tester les API directement depuis le navigateur.

Alternatives à FastAPI

  • Flask : Plus traditionnel, flexible, et avec une grande communauté.
  • Django : Framework complet avec ORM, authentification et modèles, mieux pour des applications web de grande envergure.
  • Tornado : Adapté pour des applications Web en temps réel, utilise intensément l'asynchrone.
  • AIOHTTP : Basé sur Asyncio, pour des applications serveur asynchrones.

Avantages et Inconvénients de FastAPI

Avantages :

  • Très haute performance.
  • Validation automatique des requêtes et réponses.
  • Support robuste pour l'asynchrone.

Inconvénients :

  • Communauté plus petite par rapport à Flask et Django.
  • Moins de ressources et de plugins comparés aux frameworks plus établis.

Tutoriel Basique avec FastAPI


					from fastapi import FastAPI

					app = FastAPI()

					@app.get("/")
					def read_root():
						return {"Hello": "World"}

					if __name__ == "__main__":
						import uvicorn
						uvicorn.run(app, host="0.0.0.0", port=8000)
					
Exécution et test

Ressources supplémentaires

Livres

  1. "Web Scraping with Python: A Comprehensive Guide" par Ryan Mitchell.
  2. "Learning Scrapy" par Dimitris Kouzis - Loukas.
  3. "Python Web Scraping - Second Edition" par Katharine Jarmul et Richard Lawson.

Cours en ligne

  1. "Web Scraping and API Fundamentals in Python" sur Udemy.
  2. "Scrapy: Powerful Web Scraping & Crawling with Python" sur Udemy.
  3. "Web Scraping in Python" sur DataCamp.

Autres ressources

  1. La documentation de BeautifulSoup
  2. La documentation de FastAPI
  3. Des blogs ou sites comme Real Python
  4. Les forums de discussion en ligne, comme Stack Overflow

Export PDF

  1. Cliquez ici
  2. Ouvrez la boîte de dialogue d'impression du navigateur (CTRL/CMD+P).
  3. Changez le paramètre de destination en "Enregistrer en PDF".
  4. Modifiez la mise en page en "Paysage".
  5. Réglez les marges sur "Aucune".
  6. Activez l'option "Graphiques d'arrière-plan".
  7. Cliquez sur "Enregistrer" 🎉