Скрапинг данных с 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 комментариев