Cách cạo dữ liệu Netflix bằng Python

21 tháng 4 2025
3 phút đọc
Tóm tắt được tạo bởi AI:

Thu hoạch dữ liệu từ Netflix có thể cung cấp chi tiết chuyên sâu về phim và phim truyền hình bao gồm các mục như tiêu đề, ngày phát hành, danh mục nội dung và nội dung tổng quan. Bài viết này trình bày cách trích xuất dữ liệu từ nhiều trang phim Netflix bằng Python, Yêu cầu và lxml. Vì Netflix không cung cấp API mở cho dữ liệu phim, việc Scraping cho phép chúng tôi thu thập dữ liệu nội dung có giá trị có thể hỗ trợ các đề xuất, phân tích nội dung và các ứng dụng khác.

Yêu cầu và cài đặt

Để bắt đầu, đảm bảo rằng thư viện requests và lxml đã được cài đặt. Sử dụng các lệnh sau để thiết lập môi trường của bạn:


pip install requests
pip install lxml

Các thư viện này rất cần thiết để gửi yêu cầu HTTP tới các trang Netflix và phân tích nội dung HTML để trích xuất dữ liệu cần thiết.

Thiết lập trình thu thập

Để truy cập các trang Netflix, chúng ta cần một danh sách URL mà sẽ được lặp qua để lấy chi tiết phim. Hướng dẫn này sẽ thu thập tiêu đề phim, năm phát hành, thời lượng, mô tả, thể loại và nhiều thông tin khác từ mỗi URL trang được chỉ định.

Cấu hình Headers và proxy

Netflix áp dụng các biện pháp chống bot nghiêm ngặt, vì vậy việc sử dụng headers và proxy chính xác (nếu cần) có thể ngăn chặn việc bị phát hiện. Trong script này, chúng ta giả lập một trình duyệt thực bằng cách thiết lập headers tùy chỉnh với User-Agent, tùy chọn ngôn ngữ và các tham số khác, giúp yêu cầu của chúng ta trông hợp pháp hơn.



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

Nếu cần, các proxy có thể được thêm vào để thực hiện các yêu cầu từ các địa chỉ IP khác nhau, tiếp tục giảm khả năng được gắn cờ. Ví dụ về việc tích hợp proxy với xác thực địa chỉ IP:



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

Phân tích mã từng bước

Bước 1. Thiết lập danh sách URL

Chúng tôi chỉ định một danh sách các URL phim Netflix, mà tập lệnh của chúng tôi sẽ lặp lại để trích xuất dữ liệu.



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

Bước 2. Gửi yêu cầu HTTP

Mỗi URL được truy cập bằng phương thức requests.get(), kèm theo các header để tránh bị phát hiện.



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

Bước 3. Phân tích nội dung HTML

Sử dụng lxml, chúng tôi phân tích phản hồi HTML để điều hướng và trích xuất dữ liệu bằng cách sử dụng các biểu thức XPath.


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

Bước 4. Trích xuất các yếu tố dữ liệu

Sử dụng XPath, chúng tôi nắm bắt các chi tiết phim thiết yếu như tiêu đề, năm, thời lượng, mô tả, thể loại, phụ đề, v.v. Dưới đây là cách mỗi trường được trích xuất:


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

Bước 5. Lưu dữ liệu trong danh sách

Chúng tôi lưu trữ mỗi dữ liệu của bộ phim trong một từ điển và nối nó vào một danh sách. Cách tiếp cận này giữ dữ liệu được tổ chức và sẵn sàng để được lưu trong 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)

Bước 6. Viết dữ liệu vào CSV

Cuối cùng, sau khi lặp qua tất cả các URL, chúng tôi viết dữ liệu tích lũy vào tệp 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)

Hoàn thành mã

Mã hoàn chỉnh kết hợp tất cả các bước với các tiêu đề và thiết lập 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')

Cạo dữ liệu Netflix với Python cung cấp một cách thực tế để truy cập chi tiết nội dung mà không cần API chính thức. Bằng cách sử dụng các tiêu đề, proxy và kỹ thuật phân tích cú pháp, chúng tôi thu thập và lưu dữ liệu có giá trị một cách hiệu quả. Tập lệnh này có thể được tùy chỉnh cho các phân tích phát trực tuyến, đề xuất hoặc giám sát nội dung khác nhau, giúp bạn sử dụng dữ liệu Netflix cho các ứng dụng rộng hơn.

Nội dung của bài viết:

Các bài viết gần đây

Quay lại blog
Quay lại blog