Al giorno d'oggi, l'estrazione di dati da piattaforme sociali online come IMDB può essere una strada efficace per raccogliere le informazioni necessarie sui film a scopo di ricerca o di divertimento. In questo tutorial, vedremo come effettuare lo scraping dei 250 film principali su IMDB utilizzando Python ed estraendo dettagli come titoli, riassunti, valutazioni, generi e altro ancora.
Quando si effettua lo scraping di siti web come IMDB, è fondamentale simulare il comportamento di un utente reale per ridurre al minimo il rischio di rilevamento e garantire il successo del recupero dei dati. Ecco alcune strategie che possono essere utilizzate:
Per questo tutorial, utilizzeremo la libreria requests di Python per scaricare il contenuto web, lxml per analizzare l'HTML e, facoltativamente, la libreria json per gestire i dati formattati quando necessario. Per prima cosa, installare le librerie necessarie.
Prima di iniziare, è necessario installare le librerie Python necessarie. Eseguite il seguente comando nel vostro terminale per installarle:
pip install requests lxml
Queste librerie saranno utilizzate per effettuare richieste HTTP, analizzare il contenuto HTML ed elaborare i dati estratti.
Per far sì che le nostre richieste assomiglino a quelle di un vero browser web, è fondamentale impostare le intestazioni HTTP di conseguenza. Ecco un esempio di come si potrebbero configurare queste intestazioni nel proprio 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', # Intestazione "Do Not Track
'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)
I proxy sono utili per lo scraping su larga scala. Aiutano a evitare di essere bloccati distribuendo le richieste su più IP. Ecco come includere 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)
Sostituire "your_proxy_server" con i dettagli del proxy a cui si ha accesso. In questo modo si assicura che il proprio indirizzo IP non venga esposto e si evita di essere bloccati.
Dopo aver recuperato il contenuto della pagina web, dobbiamo analizzarlo per estrarre i dettagli del film. Useremo lxml per analizzare l'HTML e json per gestire i dati strutturati:
from lxml.html import fromstring
import json
# Analizzare la risposta HTML
parser = fromstring(response.text)
# Estrarre i dati JSON-LD (dati strutturati) dal tag dello script
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Ora abbiamo i dati strutturati del film in formato JSON
La pagina IMDB Top 250 include dati strutturati incorporati nell'HTML, che possono essere facilmente consultati con XPath e analizzati come JSON. Estrarremo i dettagli del film, come il nome, la descrizione, le valutazioni, i generi e altro ancora:
movies_details = json_data.get('itemListElement')
# Eseguire il loop dei dati del filmato
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']
# Aggiungere i dati di ogni film all'elenco
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
})
Una volta estratti i dati, è importante memorizzarli in un formato facile da analizzare. In questo caso, li salveremo in un file CSV utilizzando la libreria pandas:
import pandas as pd
# Convertire l'elenco dei film in un DataFrame pandas
df = pd.DataFrame(movies_data)
# Salvare i dati in un file CSV
df.to_csv('imdb_top_250_movies.csv', index=False)
print("IMDB Top 250 movies data saved to imdb_top_250_movies.csv")
Ecco il codice completo per lo scraping dei 250 film principali di IMDB:
import requests
from lxml.html import fromstring
import json
import pandas as pd
# Definire le intestazioni per la richiesta
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',
}
# Opzionalmente, impostare i proxy
proxies = {
"http": "http://your_proxy_server",
"https": "https://your_proxy_server"
}
# Invia la richiesta alla pagina IMDB Top 250
response = requests.get('https://www.imdb.com/chart/top/', headers=headers, proxies=proxies)
# Analizzare la risposta HTML
parser = fromstring(response.text)
# Estrarre i dati JSON-LD
raw_data = parser.xpath('//script[@type="application/ld+json"]/text()')[0]
json_data = json.loads(raw_data)
# Estrarre i dettagli del 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
})
# Salvare i dati in un file 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")
Prima di effettuare lo scraping di qualsiasi sito web, è importante considerare le questioni etiche e legali:
Tenete sempre presente le regole e utilizzate il web scraping per scopi legittimi.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0