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 :
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.
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.
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)
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é.
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.
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
})
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")
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")
Avant de procéder au scraping d'un site web, il est important de tenir compte des aspects éthiques et juridiques :
Respectez toujours les règles et utilisez le web scraping à des fins légitimes.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0