Comment récupérer des données IMDB en utilisant Python

Commentaires: 0

Dans le monde d'aujourd'hui, l'extraction de données à partir de plates-formes sociales en ligne telles que IMDB peut être un moyen efficace de collecter des informations sur les films à des fins de recherche ou de divertissement. Dans ce tutoriel, nous allons parcourir le Top 250 des films sur IMDB en utilisant Python et extraire des détails tels que les titres des films, les résumés des films, les classements, les genres, et plus encore.

Lors de l'exploration de sites web tels que IMDB, il est essentiel de simuler le comportement d'un utilisateur réel afin de minimiser le risque de détection et d'assurer la récupération des données. Voici quelques stratégies qui peuvent être employées :

  1. Éviter le blocage des adresses IP : Les sites web limitent souvent le nombre de requêtes pouvant être effectuées à partir d'une seule adresse IP afin d'éviter le scraping. En utilisant des proxys, vous pouvez répartir vos demandes sur plusieurs adresses IP, ce qui réduit le risque de blocage.
  2. Garantir l'anonymat : Les proxys masquent votre adresse IP réelle, ce qui permet non seulement de protéger votre vie privée, mais aussi d'empêcher les sites web de remonter jusqu'à vous en cas d'activités de scraping.
  3. Respecter les limites de vitesse : La répartition des demandes par l'intermédiaire de plusieurs serveurs mandataires permet de gérer la fréquence des requêtes, de rester dans les limites de vitesse du site web et de réduire le risque de déclencher des mesures anti-scraping.
  4. Contourner les soupçons du serveur : L'incorporation d'en-têtes qui imitent ceux d'un navigateur classique, tels que User-Agent, peut faire en sorte que vos demandes de scraping ressemblent davantage à des demandes normales d'utilisateurs. Cela peut empêcher le serveur de signaler vos activités comme suspectes.

Étape 1 : Préparation du grattoir

Pour ce tutoriel, nous utiliserons la bibliothèque requests de Python pour télécharger le contenu web, lxml pour analyser le HTML et, éventuellement, la bibliothèque json pour traiter les données formatées lorsque cela est nécessaire. Tout d'abord, installez les bibliothèques nécessaires.

Installation des bibliothèques

Avant de commencer, vous devez installer les bibliothèques Python nécessaires. Exécutez la commande suivante dans votre terminal pour les installer :


pip install requests lxml

Ces bibliothèques seront utilisées pour effectuer des requêtes HTTP, analyser le contenu HTML et traiter les données extraites.

Configuration des en-têtes de requête HTTP

Pour que nos requêtes ressemblent à celles d'un véritable navigateur web, il est essentiel de configurer les en-têtes HTTP en conséquence. Voici un exemple de configuration de ces en-têtes dans votre script :


import requests

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',  # En-tête "Do Not Track" (ne pas suivre)
    'pragma': 'no-cache',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

response = requests.get('https://www.imdb.com/chart/top/', headers=headers)

Mise en place de serveurs mandataires

Les proxys sont utiles pour le scraping à grande échelle. Ils vous permettent d'éviter d'être bloqué en répartissant vos demandes sur plusieurs IP. Voici comment inclure un proxy :


proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

Remplacez "votre_serveur_de_proxy" par les détails du proxy auquel vous avez accès. Cela permet de s'assurer que votre adresse IP n'est pas exposée et d'éviter d'être bloqué.

Etape 2 : Analyser le contenu HTML

Après avoir récupéré le contenu de la page web, nous devons l'analyser pour extraire les détails du film. Nous utiliserons lxml pour analyser le HTML et json pour gérer les données structurées :


from lxml.html import fromstring
import json

# Analyse de la réponse HTML
parser = fromstring(response.text)

# Extraire les données JSON-LD (données structurées) de la balise de script
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Nous disposons maintenant de données structurées sur les films au format JSON.

Étape 3 : Extraction des détails du film

La page IMDB Top 250 contient des données structurées intégrées dans le code HTML, auxquelles il est facile d'accéder à l'aide de XPath et qui peuvent être analysées sous forme de JSON. Nous allons extraire les détails des films tels que le nom, la description, les notes, les genres, etc :


movies_details = json_data.get('itemListElement')

# Boucle sur les données du film
movies_data = []
for movie in movies_details:
    movie_type = movie['item']['@type']
    url = movie['item']['url']
    name = movie['item']['name']
    description = movie['item']['description']
    image = movie['item']['image']
    bestRating = movie['item']['aggregateRating']['bestRating']
    worstRating = movie['item']['aggregateRating']['worstRating']
    ratingValue = movie['item']['aggregateRating']['ratingValue']
    ratingCount = movie['item']['aggregateRating']['ratingCount']
    contentRating = movie['item'].get('contentRating')
    genre = movie['item']['genre']
    duration = movie['item']['duration']
    
    # Ajouter les données de chaque film à la liste
    movies_data.append({
        'movie_type': movie_type,
        'url': url,
        'name': name,
        'description': description,
        'image': image,
        'bestRating': bestRating,
        'worstRating': worstRating,
        'ratingValue': ratingValue,
        'ratingCount': ratingCount,
        'contentRating': contentRating,
        'genre': genre,
        'duration': duration
    })

Etape 4 : Stockage des données

Une fois les données extraites, il est important de les stocker dans un format facile à analyser. Dans ce cas, nous les enregistrerons dans un fichier CSV à l'aide de la bibliothèque pandas :


import pandas as pd

# Convertir la liste des films en un DataFrame pandas
df = pd.DataFrame(movies_data)

# Enregistrer les données dans un fichier CSV
df.to_csv('imdb_top_250_movies.csv', index=False)

print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")

Code complet

Voici le code complet pour récupérer les 250 meilleurs films d'IMDB :


import requests
from lxml.html import fromstring
import json
import pandas as pd

# Définir les en-têtes de la requête
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Optionnellement, mettre en place des proxys
proxies = {
    "http": "http://your_proxy_server",
    "https": "https://your_proxy_server"
}

# Envoyer la demande à la page IMDB Top 250
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)

# Analyse de la réponse HTML
parser = fromstring(response.text)

# Extraire les données JSON-LD
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)

# Extraire les détails du film
movies_details = json_data.get('itemListElement')

movies_data = []
for movie in movies_details:
    movie_type = movie['item']['@type']
    url = movie['item']['url']
    name = movie['item']['name']
    description = movie['item']['description']
    image = movie['item']['image']
    bestRating = movie['item']['aggregateRating']['bestRating']
    worstRating = movie['item']['aggregateRating']['worstRating']
    ratingValue = movie['item']['aggregateRating']['ratingValue']
    ratingCount = movie['item']['aggregateRating']['ratingCount']
    contentRating = movie['item'].get('contentRating')
    genre = movie['item']['genre']
    duration = movie['item']['duration']
    
    movies_data.append({
        'movie_type': movie_type,
        'url': url,
        'name': name,
        'description': description,
        'image': image,
        'bestRating': bestRating,
        'worstRating': worstRating,
        'ratingValue': ratingValue,
        'ratingCount': ratingCount,
        'contentRating': contentRating,
        'genre': genre,
        'duration': duration
    })

# Enregistrer les données dans un fichier CSV
df = pd.DataFrame(movies_data)
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")

Les considérations éthiques

Avant de procéder au scraping d'un site web, il est important de tenir compte des aspects éthiques et juridiques :

  • Respectez le fichier Robots.txt : Consultez le fichier robots.txt d'IMDB pour savoir quelles parties du site web sont autorisées à être scrappées. Respectez toujours les règles du site web.
  • Évitez de surcharger le serveur : Grattez des données de manière responsable en limitant la fréquence de vos demandes afin d'éviter de surcharger inutilement le serveur.
  • Respecter les conditions de service : Veillez à ce que le scraping n'enfreigne pas les conditions d'utilisation d'IMDB.

Respectez toujours les règles et utilisez le web scraping à des fins légitimes.

Commentaires:

0 Commentaires