Cách cạo YouTube bằng Python

Bình luận: 0

Dữ liệu cạo từ YouTube có thể là một thách thức do nội dung động và các biện pháp chống xào. Tuy nhiên, với các công cụ và kỹ thuật phù hợp, bạn có thể trích xuất một cách hiệu quả thông tin hữu ích. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn qua quá trình quét dữ liệu video YouTube bằng Python, Playwright và LXML.

Hiểu Cấu Trúc Dữ Liệu Để Trích Xuất YouTube Bằng Python

Trước khi học cách trích xuất dữ liệu từ YouTube, chúng ta cần hiểu cấu trúc của nền tảng này. YouTube có rất nhiều tính năng với vô số kiểu dữ liệu liên quan đến hoạt động người dùng và thống kê video. Một số tham số quan trọng từ nền tảng bao gồm tiêu đề và mô tả video, các thẻ được thêm vào, lượt xem, lượt thích và bình luận, cũng như thông tin về kênh và danh sách phát. Những yếu tố này rất quan trọng đối với các nhà tiếp thị nội dung và nhà sáng tạo để đánh giá hiệu suất video và xây dựng chiến lược nội dung hiệu quả.

Với YouTube Data API, các lập trình viên có thể truy cập hầu hết các chỉ số một cách lập trình. API cũng cho phép truy cập số lượng người đăng ký và video trên kênh, cung cấp lượng dữ liệu tốt để phân tích và tích hợp.

Tuy nhiên, có một số yếu tố đặc biệt không thể truy cập qua API và chỉ có thể lấy được thông qua kỹ thuật web scraping. Ví dụ: để thu thập các chỉ số chi tiết về mức độ tương tác như cảm xúc trong bình luận hoặc thời điểm người dùng tương tác, bạn sẽ cần đến phương pháp scraping trực tiếp các trang YouTube. Kỹ thuật này thường phức tạp hơn và có thể gặp rủi ro do nội dung YouTube thay đổi liên tục cùng với các quy định nghiêm ngặt về trích xuất dữ liệu.

Trong các phần tiếp theo, chúng tôi sẽ hướng dẫn bạn cách xây dựng một đoạn mã và cách trích xuất dữ liệu từ YouTube bằng Python một cách hiệu quả.

Sử Dụng Proxy Để Tránh Bị Phát Hiện Khi Trích Xuất Dữ Liệu Từ YouTube

Để trích xuất video YouTube bằng Python, việc sử dụng proxy là cần thiết để tránh bị chặn IP và vượt qua các hệ thống chống bot. Dưới đây là một số loại proxy và mô tả của chúng:

  1. Proxy dân cư (Residential proxies) được kết nối với các địa chỉ IP thực và được sử dụng như các kết nối hợp pháp tới trang web. Để trích xuất dữ liệu từ YouTube, nơi yêu cầu mức độ tin cậy cao để tránh bị phát hiện, proxy là lựa chọn tốt nhất. Chúng cho phép trình trích xuất hành xử như người dùng thực, giảm thiểu khả năng bị phát hiện là bot.
  2. Proxy ISP là lựa chọn trung gian giữa proxy dân cư và proxy trung tâm dữ liệu. Chúng được cung cấp bởi các nhà cung cấp dịch vụ Internet, những người cấp địa chỉ IP hợp lệ rất khó bị đánh dấu là proxy. Điều này làm cho chúng rất hiệu quả khi cần trích xuất kết quả tìm kiếm trên YouTube, nơi đòi hỏi tính xác thực cao và hiệu suất tốt.
  3. Mặc dù proxy trung tâm dữ liệu (Datacenter proxies) có tốc độ cao nhất, nhưng chúng dễ dàng bị YouTube phát hiện vì đến từ các trung tâm dữ liệu lớn. Rủi ro bị chặn khi trích xuất khá cao dù chúng rất hiệu quả và dễ sử dụng. Loại này phù hợp khi nhu cầu xử lý dữ liệu nhanh vượt trên nguy cơ bị phát hiện.
  4. Proxy di động (Mobile proxies) là giải pháp hợp pháp nhất vì chúng định tuyến kết nối thông qua thiết bị di động trên mạng di động. Việc sử dụng chúng cho các tác vụ scraping là hiệu quả nhất vì chúng ít bị chặn hơn. Các IP di động thường được các nhà mạng xoay vòng, làm cho loại proxy này rất khó bị đánh dấu. Tuy nhiên, cần lưu ý rằng tốc độ của chúng có thể chậm hơn so với các loại khác.

Nếu sử dụng những loại proxy này một cách chiến lược, bạn có thể trích xuất dữ liệu từ YouTube mà không bị phát hiện, cho phép truy cập dữ liệu liên tục trong khi vẫn tuân thủ Điều khoản Dịch vụ của nền tảng. Ngoài ra, việc hiểu rõ về các loại proxy sẽ giúp ích rất nhiều khi bạn cần tìm proxy cho scraping.

Cài đặt môi trường

Cài đặt các thư viện cần thiết bằng PIP:

pip install playwright 
pip install lxml

Cài đặt các nhị phân trình duyệt trình viết kịch:

playwright install

Để cài đặt các nhị phân của trình duyệt Chromium, hãy sử dụng lệnh sau:

playwright install chromium

Đối với Web Scraping Dữ liệu YouTube với Python, bạn sẽ chủ yếu cần các thư viện sau:

  1. Nhà viết kịch: Một thư viện mạnh mẽ để tự động hóa các trình duyệt không đầu, cho phép bạn tương tác với các trang web như thể bạn là người dùng thực sự;
  2. LXML: Một thư viện nhanh chóng và giàu tính năng để xử lý XML và HTML trong Python, hỗ trợ XPath cho các tài liệu truy vấn;
  3. Mô-đun CSV: Thư viện Python tích hợp để lưu dữ liệu được trích xuất vào tệp CSV.

Bước 1: Nhập thư viện cần thiết

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

Bước 2: Tự động hóa trình duyệt không đầu

Khởi chạy một trình duyệt không đầu với nhà viết kịch, điều hướng đến URL video YouTube và chờ trang tải đầy đủ.

Cuộn trang để tải thêm ý kiến.

browser = await playwright.chromium.launch(headless=True)
context = await browser.new_context()
page = await context.new_page()

# Điều hướng đến URL video YouTube
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# Cuộn xuống để tải thêm ý kiến
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Dành một chút thời gian để tải thêm nội dung
await page.wait_for_timeout(1000)

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

Trích xuất nội dung HTML của trang bằng nhà viết kịch và phân tích nó bằng LXML.

# Trích xuất nội dung trang
page_content = await page.content()

# Phân tích nội dung HTML
parser = html.fromstring(page_content)

Bước 4: Trích xuất dữ liệu

Trích xuất các điểm dữ liệu cần thiết (ví dụ: tiêu đề, kênh, nhận xét) bằng cách sử dụng các biểu thức XPath.

Thu thập tất cả dữ liệu liên quan, bao gồm siêu dữ liệu video và bình luận.

# Trích xuất dữ liệu video
title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

Bước 5: Lưu dữ liệu

Lưu dữ liệu được trích xuất vào tệp CSV để phân tích và lưu trữ dễ dàng.

# Lưu dữ liệu vào tệp CSV
with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
    writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

Thực hiện proxy

Các proxy đóng một vai trò quan trọng trong việc cạo web, đặc biệt là khi xử lý trích xuất dữ liệu quy mô lớn hoặc các trang web với các biện pháp chống Bot nghiêm ngặt như YouTube. Đây là cách các proxy được thực hiện trong tập lệnh nhà viết kịch:

Thiết lập proxy:

  1. Tham số proxy trong Playwright.chromium.launch () được sử dụng để định tuyến tất cả lưu lượng truy cập trình duyệt thông qua một máy chủ proxy được chỉ định.
  2. Các chi tiết máy chủ proxy, bao gồm địa chỉ máy chủ, tên người dùng và mật khẩu, phải được cấu hình.

browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )

Lợi ích của việc sử dụng proxy:

  • Mặt nạ IP: Proxy ẩn địa chỉ IP ban đầu của bạn, giảm khả năng bị chặn.
  • Phân phối yêu cầu: Bằng cách xoay các proxy, bạn có thể phân phối các yêu cầu trên các địa chỉ IP khác nhau, bắt chước lưu lượng từ nhiều người dùng.
  • Nội dung bị hạn chế truy cập: Proxy có thể giúp bỏ qua các hạn chế khu vực hoặc nội dung truy cập có thể bị giới hạn trong các phạm vi IP nhất định.

Việc triển khai này đảm bảo các hoạt động cạo của bạn ít có khả năng được phát hiện và chặn bởi các cơ chế chống Bot của YouTube.

Hoàn thành triển khai mã

Dưới đây là mã hoàn chỉnh để cạo dữ liệu video trên YouTube bằng Playwright và LXML, bao gồm cả triển khai proxy.

import asyncio
from playwright.async_api import Playwright, async_playwright
from lxml import html
import csv

# Chức năng không đồng bộ để chạy nhà viết kịch và trích xuất dữ liệu
async def run(playwright: Playwright) -> None:
    # Khởi chạy trình duyệt không đầu với cài đặt proxy
    browser = await playwright.chromium.launch(
        headless=True,
        proxy={"server": "http://your_proxy_ip:port", "username": "your_username", "password": "your_password"}
    )
    context = await browser.new_context()
    page = await context.new_page()

    # Điều hướng đến URL video YouTube
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # Cuộn xuống để tải thêm ý kiến
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Dành một chút thời gian để tải thêm nội dung
    await page.wait_for_timeout(1000)
    
    # Trích xuất nội dung trang
    page_content = await page.content()

    # Đóng trình duyệt
    await context.close()
    await browser.close()

    # Phân tích nội dung HTML
    parser = html.fromstring(page_content)

    # Trích xuất dữ liệu video
    title = parser.xpath('//div[@id="title"]/h1/yt-formatted-string/text()')[0]
    channel = parser.xpath('//yt-formatted-string[@id="text"]/a/text()')[0]
    channel_link = 'https://www.youtube.com' + parser.xpath('//yt-formatted-string[@id="text"]/a/@href')[0]
    posted = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[2]
    total_views = parser.xpath('//yt-formatted-string[@id="info"]/span/text()')[0]
    total_comments = parser.xpath('//h2[@id="count"]/yt-formatted-string/span/text()')[0]
    comments_list = parser.xpath('//yt-attributed-string[@id="content-text"]/span/text()')

    # Lưu dữ liệu vào tệp CSV
    with open('youtube_video_data.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(["Title", "Channel", "Channel Link", "Posted", "Total Views", "Total Comments", "Comments"])
        writer.writerow([title, channel, channel_link, posted, total_views, total_comments, ", ".join(comments_list)])

# Chạy chức năng không đồng bộ
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

Khi thiết lập một môi trường để quét dữ liệu từ YouTube, điều quan trọng là phải tập trung vào việc sử dụng các proxy để phá vỡ các hạn chế nền tảng một cách hiệu quả. Chọn cẩn thận các máy chủ proxy là điều cần thiết để giảm thiểu rủi ro chặn và đảm bảo hoạt động ẩn danh. Các proxy ISP tĩnh rất được khuyến khích cho tốc độ kết nối nhanh và độ ổn định của chúng. Ngoài ra, các proxy dân cư cung cấp các địa chỉ IP động với yếu tố tin cậy cao, khiến chúng ít bị gắn cờ bởi các hệ thống bảo mật YouTube. Điều quan trọng là phải tuân thủ các tiêu chuẩn đạo đức trong quá trình thu thập dữ liệu để ngăn chặn vi phạm các điều khoản dịch vụ của YouTube.

Bình luận:

0 Bình luận