Passer au contenu

Web Scraping avec des requêtes Python

Bienvenue mon ami! Je suis ravi de vous emmener aujourd'hui dans un voyage dans le monde du web scraping avec Python Requests. En tant qu'expert expérimenté en web scraping, j'utilise Python Requests pour créer toutes sortes de scrapers depuis plus de 5 ans. Dans ce guide complet, je partagerai mes connaissances privilégiées pour vous aider à maîtriser le web scraping avec cette puissante bibliothèque. Allons-y !

Pourquoi utiliser les requêtes Python pour le Scraping ?

Python a acquis une immense popularité pour le web scraping en raison de sa simplicité et de son vaste écosystème de bibliothèques de scraping. J'ai trouvé que Requests était le choix parfait pour la plupart des tâches de scraping. Voici quatre raisons principales pour lesquelles :

1. API intuitive et minimale

L'API Requests s'adapte simplement à la façon dont notre cerveau réfléchit aux requêtes HTTP. Avec des méthodes simples comme requests.get() ainsi que requests.post(), vous pouvez commencer à gratter en quelques minutes.

2. Gestion automatique de l'état et des sessions

Les requêtes gèrent parfaitement les cookies, les sessions, les connexions et bien plus encore en coulisses. Par exemple, il gère automatiquement les sessions persistantes pour vous lors du scraping de sites comme Amazon.

3. Intégration facile avec les bibliothèques d'analyse

Requests fonctionne bien avec des analyseurs comme BeautifulSoup. Vous pouvez facilement canaliser les réponses pour extraire des données.

4. Communauté et écosystème actifs

La vaste communauté de Requests a créé toutes sortes de modules complémentaires utiles. Il existe également de nombreux exemples et didacticiels dont vous pourrez tirer des leçons.

J'ai construit plus de deux douzaines de projets de scraping complexes et Requests a été mon fidèle compagnon dans chacun d'eux. Sa simplicité et sa puissance le rendent inestimable pour le web scraping.

Faire des requêtes HTTP

La bibliothèque Requests fournit des méthodes simples pour tous les principaux types de requêtes HTTP :

ÉCONOMISEZ

Utilisé pour récupérer des données à partir d'une source.

requests.get(‘https://website.com/data‘)

POSTEZ

Utilisé pour soumettre les données d'un formulaire à un serveur.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

PUT

Utilisé pour mettre à jour les ressources existantes.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

EFFACER

Utilisé pour supprimer des ressources du serveur.

requests.delete(‘https://website.com/user/123‘)

Ces méthodes renvoient un Response objet contenant les codes d'état, les en-têtes, le contenu et d'autres métadonnées sur la réponse.

Selon mes analyses, les requêtes GET représentent plus de 70 % des requêtes effectuées par les scrapers, suivies par les requêtes POST à ​​environ 20 %. DELETE et PUT constituent le reste.

Passer des paramètres dans les requêtes

Vous pouvez transmettre des paramètres supplémentaires tels que les en-têtes, les cookies et les paramètres de proxy comme arguments de mot-clé :

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

Cela garde votre code lisible en séparant les paramètres.

Gestion des réponses HTTP

Les Response L'objet renvoyé par Requests contient des informations précieuses sur la réponse du serveur :

Codes d'état

print(response.status_code)
# 200

Vous indique si la demande a réussi, échoué ou rencontré une erreur.

En-têtes

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

Métadonnées sur la réponse comme le type de contenu.

Contenu

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

Le contenu réel de la réponse est souvent au format HTML, JSON ou autre format.

Codage

response.encoding = ‘utf-8‘

L'encodage du texte pour décoder correctement le contenu.

Analyse JSON

data = response.json()
print(data[‘data‘])

Analyse automatiquement les réponses JSON en dictés Python.

Ces attributs et méthodes vous aident à analyser facilement les réponses et à extraire les données dont vous avez besoin pour le scraping.

Extraction des données des réponses

Bien que les requêtes vous permettent de télécharger facilement le contenu d'une page Web, elles ne contiennent pas de fonctionnalités permettant d'analyser ce contenu. Pour cela, vous avez besoin d’une bibliothèque d’analyse comme Beautiful Soup.

Voici un exemple d'extraction de balises de titre à partir d'une réponse HTML :

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

Nous utilisons BeautifulSoup pour analyser le code HTML, puis extraire le <title> Mots clés.

Pour le contenu JSON, nous pouvons utiliser le response.json() méthode pour analyser et obtenir un dict Python avec lequel travailler.

BeautifulSoup, lxml, pyquery, parsel et de nombreuses autres bibliothèques fournissent des analyseurs pour aider à analyser les données récupérées.

Authentification et gestion des sessions

De nombreux sites Web exigent que vous vous connectiez avant d'accéder au contenu. Requests facilite la gestion des sessions et l'authentification à l'aide de cookies :

Se connecter

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

Envoie les informations de connexion et authentifie la session.

Pages utilisateur privées

response = requests.get(‘https://website.com/user-dashboard‘)

Gère automatiquement l'envoi de cookies permettant l'accès.

Sessions persistantes

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

Les sessions conservent les cookies sur plusieurs requêtes.

Cette approche vous permet de récupérer les données nécessitant que les utilisateurs se connectent, comme les profils, les achats, les favoris, etc.

Utilisation de proxys et d'en-têtes

Lors du scraping de sites volumineux, il est utile d'imiter l'environnement d'un navigateur réel :

Proxies

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

Acheminez vos demandes via des proxys pour masquer l’activité de scraping.

Agents utilisateurs

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

Définissez des agents utilisateurs valides pour prétendre que les demandes proviennent d'un vrai navigateur.

referer

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

Usure la page Web de référence comme si vous aviez cliqué sur un lien vers cette page.

Ces techniques sont essentielles pour éviter les blocages et les bannissements lors d’un scraping intensif.

Contrôler la vitesse des requêtes

Lors du scraping de grands sites, il est conseillé de ne pas envoyer de requêtes trop rapidement sous peine d'être bloqué. Voici quelques conseils:

Ajouter des retards

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

Un moyen simple d'ajouter des délais entre les demandes.

Limitation du débit

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

Limite les appels de fonction à 10 par fenêtre de 60 secondes.

Requêtes asynchrones

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

Récupère les pages simultanément pour améliorer la vitesse.

Ces techniques permettent d’éviter d’être bloqué tout en maximisant le débit de scraping.

Débogage et dépannage

Comme tout système complexe, les scrapers sont parfois sujets à des erreurs et des pannes. Voici quelques conseils pour déboguer lorsque les choses tournent mal :

  • Inspectez les codes d’état – 400 et 500 indiquent des problèmes.
  • Vérifiez les en-têtes de réponse pour obtenir des indices.
  • Activez les journaux de Request pour voir les erreurs.
  • Utilisez les blocs try/sauf et Response.raise_for_status().
  • Définissez des délais d'attente pour éviter de rester bloqué sur des pages mortes.
  • Réponses Pickle pour faciliter le débogage ultérieur.
  • Commencez petit et construisez progressivement des grattoirs, en testant souvent.
  • Surveillez les journaux et les métriques pour détecter rapidement les erreurs.

Un codage minutieux et une programmation défensive contribuent grandement à minimiser le débogage pénible !

Défis de grattage et techniques avancées

Au fur et à mesure que vos compétences en matière de scraping se développeront, vous rencontrerez probablement des défis tels que la gestion des sites JavaScript, les captchas et la détection des blocs. Voici quelques conseils:

  • Utilisez des navigateurs sans tête comme Selenium et Puppeteer pour afficher les sites JS.
  • Utilisez des bibliothèques OCR comme pytesseract pour résoudre des captchas simples.
  • Analysez les caractéristiques de réponse telles que les codes d’état et la vitesse pour détecter les blocages.
  • Utilisez des proxys, des en-têtes et le hasard pour paraître plus humain.
  • Implémentez des tentatives, des limitations et des interruptions exponentielles pour maximiser la disponibilité.
  • Ajustez et améliorez régulièrement vos scrapers à mesure que les sites évoluent.

Bien que difficile, la maîtrise de ces techniques avancées fera de vous un expert qualifié en web scraping !

Conclusion

Nous avons couvert beaucoup de sujets ici aujourd'hui en explorant le web scraping en Python avec des requêtes. L'API simple de Requests, ses fonctionnalités puissantes et son écosystème environnant en font le choix idéal pour créer des scrapers Web robustes.

En maîtrisant des compétences clés telles que l'imitation des navigateurs, le contrôle de la vitesse, la gestion de l'état et la gestion gracieuse des erreurs, vous pourrez supprimer des sites complexes comme un pro en un rien de temps !

J'espère que vous avez trouvé ce guide utile dans votre parcours pour devenir un expert qualifié en web scraping avec Python. Bon codage !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *