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.

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