Come scrappare i dati di Netflix usando Python

Commenti: 0

L'estrazione di dati da Netflix può fornire dettagli approfonditi su film e serie TV, tra cui elementi come titoli, date di rilascio, categorie di contenuti e panoramica dei contenuti. Questo articolo mostra come estrarre dati da più pagine di film di Netflix utilizzando Python, richieste e lxml. Poiché Netflix non fornisce un'API aperta per i dati sui film, lo scraping ci permette di raccogliere dati preziosi sui contenuti che possono supportare raccomandazioni, analisi dei contenuti e altre applicazioni.

Requisiti e installazione

Per iniziare, assicurarsi che le librerie requests e lxml siano installate. Usare i seguenti comandi per configurare l'ambiente:


pip install requests
pip install lxml

Queste librerie sono essenziali per l'invio di richieste HTTP alle pagine Netflix e per il parsing del contenuto HTML per estrarre i dati richiesti.

Impostazione del raschietto

Per accedere alle pagine di Netflix, abbiamo bisogno di un elenco di URL da scorrere per recuperare i dettagli dei film. Questa esercitazione recupera il titolo del film di Netflix, l'anno, la durata, la descrizione, il genere e altro ancora da ogni URL di pagina specificato.

Intestazioni e configurazione del proxy

Netflix adotta rigorose misure anti-bot, pertanto l'utilizzo di intestazioni e proxy corretti (se necessario) può impedire il rilevamento. In questo script, imitiamo un browser reale impostando intestazioni personalizzate con User-Agent, preferenze di lingua e altri parametri, facendo apparire le nostre richieste più legittime.



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',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    '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/130.0.0.0 Safari/537.36',
}

Se necessario, è possibile aggiungere dei proxy per effettuare richieste da indirizzi IP diversi, riducendo ulteriormente la probabilità di essere segnalati. Esempio di integrazione di un proxy con l'autenticazione dell'indirizzo IP:



proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'http://your_proxy_address:port',
}
response = requests.get(url, headers=headers, proxies=proxies)

Ripartizione del codice passo dopo passo

Passo 1. Impostazione dell'elenco degli URL

Specifichiamo un elenco di URL di film di Netflix, che il nostro script itererà per estrarre i dati.



urls_list = [
    'Https link', 
    'Https link'
]

Passo 2. Invio della richiesta HTTP

A ogni URL si accede con il metodo requests.get(), passando le intestazioni per evitare il rilevamento.



response = requests.get(url, headers=headers)

Passo 3. Parsing del contenuto HTML

Utilizzando lxml, analizziamo la risposta HTML per navigare ed estrarre i dati utilizzando le espressioni XPath.


from lxml.html import fromstring
parser = fromstring(response.text)

Passo 4. Estrazione degli elementi dei dati

Utilizzando XPath, catturiamo i dettagli essenziali di un film come titolo, anno, durata, descrizione, genere, sottotitoli e altro ancora. Di seguito viene illustrato come viene estratto ogni campo:


title = parser.xpath('//h1[@class="title-title"]/text()')[0]
year = parser.xpath('//span[@data-uia="item-year"]/text()')[0]
duration = parser.xpath('//span[@class="duration"]/text()')[0]
description = parser.xpath('//div[@class="title-info-synopsis"]/text()')[0]
maturity_number = parser.xpath('//span[@class="maturity-number"]/text()')[0]
starring = parser.xpath('//span[@data-uia="info-starring"]/text()')[0]
genre = parser.xpath('//a[@data-uia="item-genre"]/text()')[0]
genres = parser.xpath('//span[@data-uia="more-details-item-genres"]/a/text()')
subtitles = ''.join(parser.xpath('//span[@data-uia="more-details-item-subtitle"]/text()'))
audio = ''.join(parser.xpath('//span[@data-uia="more-details-item-audio"]/text()'))

Passo 5. Salvataggio dei dati in un elenco

Memorizziamo i dati di ogni film in un dizionario e li aggiungiamo a un elenco. Questo approccio mantiene i dati organizzati e pronti per essere salvati in CSV.



data = {
    'title': title,
    'year': year,
    'duration': duration,
    'description': description,
    'maturity_number': maturity_number,
    'starring': starring,
    'genre': genre,
    'genres': genres,
    'subtitles': subtitles,
    'audio': audio
}
extracted_data.append(data)

Passo 6. Scrittura dei dati in CSV

Infine, dopo aver iterato tutti gli URL, scriviamo i dati accumulati in un file CSV.



import csv

with open('netflix_data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=extracted_data[0].keys())
    writer.writeheader()
    writer.writerows(extracted_data)

Codice completo

Il codice completo combina tutti i passaggi con le intestazioni e l'impostazione del proxy.


import requests
from lxml.html import fromstring
import csv

urls_list = [
    'Https link', 
    'Https link'
]

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',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    '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/130.0.0.0 Safari/537.36',
}

proxies = {
    'http': 'http://your_proxy_address:port',
    'https': 'http://your_proxy_address:port',
}

extracted_data = []
for url in urls_list:
    response = requests.get(url, headers=headers, proxies=proxies)
    parser = fromstring(response.text)
    
    title = parser.xpath('//h1[@class="title-title"]/text()')[0]
    year = parser.xpath('//span[@data-uia="item-year"]/text()')[0]
    duration = parser.xpath('//span[@class="duration"]/text()')[0]
    description = parser.xpath('//div[@class="title-info-synopsis"]/text()')[0]
    maturity_number = parser.xpath('//span[@class="maturity-number"]/text()')[0]
    starring = parser.xpath('//span[@data-uia="info-starring"]/text()')[0]
    genre = parser.xpath('//a[@data-uia="item-genre"]/text()')[0]
    genres = parser.xpath('//span[@data-uia="more-details-item-genres"]/a/text()')
    subtitles = ''.join(parser.xpath('//span[@data-uia="more-details-item-subtitle"]/text()'))
    audio = ''.join(parser.xpath('//span[@data-uia="more-details-item-audio"]/text()'))

    data = {
        'title': title,
        'year': year,
        'duration': duration,
        'description': description,
        'maturity_number': maturity_number,
        'starring': starring,
        'genre': genre,
        'genres': genres,
        'subtitles': subtitles,
        'audio': audio
    }
    extracted_data.append(data)

with open('netflix_data.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=extracted_data[0].keys())
    writer.writeheader()
    writer.writerows(extracted_data)
print('saved into netflix_data.csv')

Lo scraping dei dati di Netflix con Python offre un modo pratico per accedere ai dettagli dei contenuti senza un'API ufficiale. Utilizzando intestazioni, proxy e tecniche di parsing, raccogliamo e salviamo dati preziosi in modo efficace. Questo script può essere personalizzato per varie analisi dello streaming, raccomandazioni o monitoraggio dei contenuti, aiutandovi a utilizzare i dati di Netflix per applicazioni più ampie.

Commenti:

0 Commenti