Como fazer scraping do YouTube usando Python

Comentários: 0

Extrair dados do YouTube pode ser um desafio devido ao seu conteúdo dinâmico e às medidas anti-raspagem. No entanto, com as ferramentas e técnicas certas, é possível extrair informações úteis com eficiência. Neste artigo, vamos orientá-lo no processo de raspagem de dados de vídeo do YouTube usando Python, Playwright e lxml.

Configuração do ambiente

Instale as bibliotecas necessárias usando pip:

pip install playwright 
pip install lxml

Instale os binários do navegador Playwright:

playwright install

Para instalar apenas os binários do navegador Chromium, utilize o seguinte comando:

playwright install chromium

Para raspar dados do YouTube na Web com Python, você precisará principalmente das seguintes bibliotecas:

  1. Playwright: Uma biblioteca poderosa para automatizar navegadores sem cabeça, permitindo que você interaja com páginas da Web como se fosse um usuário real;
  2. lxml: Uma biblioteca rápida e rica em recursos para processar XML e HTML em Python, com suporte a XPath para consulta de documentos;
  3. Módulo CSV: Uma biblioteca Python embutida para salvar dados extraídos em um arquivo CSV.

Passo 1: Importar as bibliotecas necessárias

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

Passo 2: Automação do navegador sem cabeça

Inicie um browser sem cabeça com o Playwright, navegue até ao URL do vídeo do YouTube e aguarde que a página seja totalmente carregada.

Percorrer a página para ver mais comentários.

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

# Navegar para o URL do vídeo do YouTube
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# Deslocação para baixo para ver mais comentários
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Dar algum tempo para que o conteúdo adicional seja carregado
await page.wait_for_timeout(1000)

Passo 3: análise de conteúdo HTML

Extraia o conteúdo HTML da página usando o Playwright e analise-o com lxml.

# Extrair o conteúdo da página
page_content = await page.content()

# Analisar o conteúdo HTML
parser = html.fromstring(page_content)

Passo 4: Extração de dados

Extraia os pontos de dados necessários (por exemplo, título, canal, comentários) usando expressões XPath.

Colete todos os dados relevantes, incluindo metadados de vídeo e comentários.

# Extração de dados de vídeo
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()')

Passo 5: Salvando dados

Salve os dados extraídos em um arquivo CSV para facilitar a análise e o armazenamento.

# Guardar os dados num ficheiro 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)])

Implementação de proxy

Os proxies desempenham um papel crucial na raspagem da Web, especialmente quando se trata de extração de dados em grande escala ou de sites com medidas anti-bot rigorosas, como o YouTube. Veja como os proxies são implementados no script do Playwright:

Configuração do proxy:

  1. O parâmetro proxy em playwright.chromium.launch() é usado para rotear todo o tráfego do navegador através de um servidor proxy especificado.
  2. Os detalhes do servidor proxy, incluindo o endereço do servidor, nome de usuário e senha, devem ser configurados.

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

Benefícios da utilização de proxies:

  • Mascaramento de IP: os proxies escondem o seu endereço IP original, reduzindo a probabilidade de ser bloqueado.
  • Distribuição de pedidos: ao rodar proxies, é possível distribuir pedidos por diferentes endereços IP, imitando o tráfego de vários utilizadores.
  • Acessar conteúdo restrito: os proxies podem ajudar a contornar restrições regionais ou acessar conteúdo que pode ser limitado a determinados intervalos de IP.

Essa implementação garante que suas atividades de raspagem tenham menos probabilidade de serem detectadas e bloqueadas pelos mecanismos anti-bot do YouTube.

Implementação completa do código

Abaixo está o código completo para raspar dados de vídeo do YouTube usando Playwright e lxml, incluindo a implementação de proxy.

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

# Função assíncrona para executar o Playwright e extrair dados
async def run(playwright: Playwright) -> None:
    # Iniciar o navegador sem cabeça com definições de 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()

    # Navegar para o URL do vídeo do YouTube
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # Deslocação para baixo para ver mais comentários
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Dar algum tempo para que o conteúdo adicional seja carregado
    await page.wait_for_timeout(1000)
    
    # Extrair o conteúdo da página
    page_content = await page.content()

    # Fechar o browser
    await context.close()
    await browser.close()

    # Analisar o conteúdo HTML
    parser = html.fromstring(page_content)

    # Extração de dados de vídeo
    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()')

    # Guardar os dados num ficheiro 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)])

# Execução da função assíncrona
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

Ao configurar um ambiente para extrair dados do YouTube, é crucial concentrar-se na utilização de proxies para contornar eficazmente as restrições da plataforma. A seleção cuidadosa dos servidores proxy é essencial para minimizar os riscos de bloqueio e garantir o anonimato da operação. Os proxies ISP estáticos são altamente recomendados pelas suas velocidades de ligação rápidas e estabilidade. Além disso, os proxies residenciais oferecem endereços IP dinâmicos com um elevado fator de confiança, tornando-os menos susceptíveis de serem sinalizados pelos sistemas de segurança do YouTube. Também é vital aderir a padrões éticos durante a recolha de dados para evitar violações dos termos de serviço do YouTube.

Comentários:

0 Comentários