Pozyskiwanie danych z serwisu Netflix może dostarczyć szczegółowych informacji na temat filmów i seriali telewizyjnych, w tym takich elementów jak tytuły, daty premiery, kategorie treści i przegląd treści. W tym artykule pokazano, jak wyodrębnić dane z wielu stron z filmami Netflix przy użyciu Pythona, żądań i lxml. Ponieważ Netflix nie udostępnia otwartego API dla danych filmowych, skrobanie pozwala nam gromadzić cenne dane dotyczące treści, które mogą wspierać rekomendacje, analizę treści i inne aplikacje.
Aby rozpocząć, upewnij się, że zainstalowane są biblioteki requests i lxml. Użyj następujących poleceń, aby skonfigurować środowisko:
pip install requests
pip install lxml
Biblioteki te są niezbędne do wysyłania żądań HTTP do stron Netflix i analizowania zawartości HTML w celu wyodrębnienia wymaganych danych.
Aby uzyskać dostęp do stron Netflix, potrzebujemy listy adresów URL, które będziemy iterować w celu pobrania szczegółów filmu. Ten samouczek pobierze tytuł filmu Netflix, rok, czas trwania, opis, gatunek i inne informacje z każdego określonego adresu URL strony.
Netflix stosuje rygorystyczne środki antybotowe, więc używanie poprawnych nagłówków i serwerów proxy (jeśli to konieczne) może zapobiec wykryciu. W tym skrypcie naśladujemy prawdziwą przeglądarkę, konfigurując niestandardowe nagłówki z User-Agent, preferencjami językowymi i innymi parametrami, dzięki czemu nasze żądania wyglądają bardziej legalnie.
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',
}
W razie potrzeby można dodać serwery proxy, aby wysyłać żądania z różnych adresów IP, co dodatkowo zmniejsza prawdopodobieństwo oflagowania. Przykład integracji serwera proxy z uwierzytelnianiem adresu IP:
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'http://your_proxy_address:port',
}
response = requests.get(url, headers=headers, proxies=proxies)
Określamy listę adresów URL filmów Netflix, które nasz skrypt będzie iterował w celu wyodrębnienia danych.
urls_list = [
'Https link',
'Https link'
]
Każdy adres URL jest dostępny za pomocą metody requests.get(), przekazując nagłówki, aby uniknąć wykrycia.
response = requests.get(url, headers=headers)
Korzystając z lxml, analizujemy odpowiedź HTML, aby nawigować i wyodrębniać dane za pomocą wyrażeń XPath.
from lxml.html import fromstring
parser = fromstring(response.text)
Używając XPath, przechwytujemy istotne szczegóły filmu, takie jak tytuł, rok, czas trwania, opis, gatunek, napisy i inne. Poniżej przedstawiono sposób wyodrębniania każdego pola:
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()'))
Przechowujemy dane każdego filmu w słowniku i dołączamy je do listy. Dzięki temu dane są uporządkowane i gotowe do zapisania w pliku 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)
Na koniec, po iteracji przez wszystkie adresy URL, zapisujemy zgromadzone dane do pliku 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)
Kompletny kod łączy wszystkie kroki z nagłówkami i konfiguracją 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')
Skrobanie danych Netflix za pomocą Pythona to praktyczny sposób na uzyskanie dostępu do szczegółów treści bez oficjalnego API. Korzystając z nagłówków, serwerów proxy i technik parsowania, skutecznie gromadzimy i zapisujemy cenne dane. Skrypt ten można dostosować do różnych analiz strumieniowych, rekomendacji lub monitorowania treści, pomagając wykorzystać dane Netflix do szerszych zastosowań.
Komentarze: 0