Скрапінг даних з Netflix за допомогою Python

Коментарі: 0

Збір даних із Netflix допоможе виявити безліч корисних відомостей про фільми та серіали, як-от назви, дати релізів, жанри та рецензії. У цій статті розглядається методика вилучення цих даних з використанням Python і бібліотек requests і lxml для аналізу HTML-контенту сторінок Netflix. Оскільки платформа не пропонує публічного API для доступу до інформації про свій контент, методика скрапінгу стає ключовим інструментом для отримання даних, які можна використовувати для розробки систем рекомендацій, аналізу контенту та інших цілей.

Встановлення бібліотек

Перед початком переконайтеся, що встановлено бібліотеки requests і lxml. Використовуйте такі команди для налаштування робочого середовища:


pip install requests
pip install lxml


Ці бібліотеки необхідні для надсилання HTTP-запитів на сторінки Netflix і аналізу HTML-контенту для вилучення необхідних даних.

Покроковий процес налаштування скрапера

Для доступу до сторінок Netflix необхідний список URL, за якими буде здійснюватися перехід для вилучення інформації про фільми. У цьому посібнику буде показано, як витягувати інформацію про назву фільму, рік випуску, тривалість, опис, жанр та інші дані з кожної зазначеної сторінки Netflix.

Попереднє налаштування заголовків і проксі

Netflix використовує захисні технології проти ботів, тому правильне використання заголовків і проксі може запобігти виявленню. У цьому скрипті моделюється поведінка справжнього браузера шляхом налаштування користувацьких заголовків із зазначенням User-Agent, уподобань мови та інших параметрів, що робить запити менш підозрілими.


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',
}

За необхідності можна додати проксі для виконання запитів із різних IP-адрес, що ще більше зменшить імовірність виявлення. Приклад інтеграції проксі з авторизацією за IP-адресою:


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

Крок 1: Створення списку URL

Вказуємо список URL-адрес фільмів Netflix, який скрипт буде перебирати для вилучення даних.


urls_list = [
    'Https ссылка', 
    'Https ссылка'
]

Крок 2: Надсилання HTTP-запитів

Доступ до кожного URL здійснюється за допомогою методу requests.get(), передаючи заголовки для уникнення виявлення.


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

Крок 3: Парсинг HTML-вмісту

Використовуючи lxml, парсимо HTML-відповідь для навігації та вилучення даних за допомогою виразів XPath.


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

Крок 4: Витяг даних

За допомогою XPath захоплюємо важливі дані про фільм, такі як назва, рік, тривалість, опис, жанр, субтитри та інше. Нижче наведено приклад, як витягується кожне поле:


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()'))

Крок 5: Збереження даних у списку

Кожні зібрані дані про фільм зберігаємо в словник і додаємо його до списку. Цей підхід дає змогу організовано зберігати дані та готувати їх до конвертації в 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)

Крок 6: Запис даних у CSV

Після перебору всіх URL записуємо накопичені дані в 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)

Повна версія коду


import requests
from lxml.html import fromstring
import csv

urls_list = [
    'Https ссылка', 
    'Https ссылка'
]

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

Скрапінг даних з Netflix з використанням Python являє собою ефективний метод доступу до інформації про контент, яка не доступна через офіційні API. Застосування спеціалізованих заголовків, налаштувань проксі та технік парсингу дає змогу точно й ефективно витягувати дані, які можуть бути використані для різноманітних аналітичних і моніторингових цілей. Такий підхід забезпечує гнучкість у налаштуванні скрипта для адаптації під конкретні задачі аналізу, рекомендації контенту або навіть дослідницькі проєкти, значно розширюючи можливості використання даних Netflix у різних додатках.

Коментарії:

0 Коментаріїв