Come raschiare i dati di IMDB usando Python

Commenti: 0

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:

  1. Evitare il blocco degli IP: I siti web spesso limitano il numero di richieste che possono essere effettuate da un singolo indirizzo IP per evitare lo scraping. Utilizzando i proxy, è possibile distribuire le richieste su più indirizzi IP, riducendo il rischio di essere bloccati.
  2. Assicura l'anonimato: I proxy mascherano il vostro indirizzo IP reale, il che non solo aiuta a proteggere la vostra privacy, ma rende anche più difficile per i siti web risalire alle vostre attività di scraping.
  3. Rispetto dei limiti di velocità: Distribuire le richieste attraverso più proxy può aiutare a gestire la frequenza delle query, rimanendo entro i limiti di velocità del sito web e riducendo la probabilità di attivare misure anti-scraping.
  4. Eseguire i sospetti del server: Incorporare intestazioni che imitano quelle di un browser tipico, come User-Agent, può far apparire le richieste di scraping come normali richieste dell'utente. Questo può impedire al server di segnalare le vostre attività come sospette.

Fase 1: preparazione dello scraper

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.

Installazione delle librerie

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.

Configurazione delle intestazioni delle richieste HTTP

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)

Impostazione dei proxy

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.

Fase 2: analizzare il contenuto HTML

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

Fase 3: Estrazione dei dettagli del filmato

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

Fase 4: Memorizzazione dei dati

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

Codice completo

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

Considerazioni etiche

Prima di effettuare lo scraping di qualsiasi sito web, è importante considerare le questioni etiche e legali:

  • Rispettare il Robots.txt: Controllare il file robots.txt di IMDB per vedere quali parti del sito web sono consentite per lo scraping. Rispettate sempre le politiche del sito web.
  • Evitare di sovraccaricare il server: Effettuare lo scraping dei dati in modo responsabile, limitando la frequenza delle richieste per evitare di sovraccaricare inutilmente il server.
  • Rispettare i termini di servizio: Assicurarsi che lo scraping non violi i termini di servizio di IMDB.

Tenete sempre presente le regole e utilizzate il web scraping per scopi legittimi.

Commenti:

0 Commenti