Cómo scrapear YouTube usando Python

Comentarios: 0

El scraping de datos de YouTube puede ser todo un reto debido a su contenido dinámico y a las medidas anti-scraping. Sin embargo, con las herramientas y técnicas adecuadas, puedes extraer información útil de forma eficiente. En este artículo, te guiaremos a través del proceso de raspado de datos de vídeo de YouTube utilizando Python, Playwright y lxml.

Configuración del entorno

Instala las librerías necesarias usando pip:

pip install playwright 
pip install lxml

Instale los binarios del navegador Playwright:

playwright install

Para solo instalar los binarios del navegador Chromium usa el siguiente comando:

playwright install chromium

Para el web scraping de datos de YouTube con Python, necesitarás principalmente las siguientes librerías:

  1. Playwright: Una potente librería para automatizar navegadores headless, que te permite interactuar con páginas web como si fueras un usuario real;
  2. lxml: Una biblioteca rápida y rica en funciones para procesar XML y HTML en Python, compatible con XPath para la consulta de documentos;
  3. Módulo CSV: Una biblioteca incorporada de Python para guardar los datos extraídos en un archivo CSV.

Paso 1: Importar las bibliotecas necesarias

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

Paso 2: Automatización del navegador sin cabeza

Inicie un navegador sin cabeza con Playwright, navegue hasta la URL del vídeo de YouTube y espere a que la página se cargue por completo.

Desplaza la página para cargar más comentarios.

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

# Navegar a la URL del vídeo de YouTube
await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

# Desplazarse hacia abajo para cargar más comentarios
for _ in range(20):
    await page.mouse.wheel(0, 200)
    await asyncio.sleep(0.2)

# Dar tiempo a que se cargue el contenido adicional
await page.wait_for_timeout(1000)

Paso 3: análisis del contenido HTML

Extraer el contenido HTML de la página usando Playwright y parsearlo con lxml.

# Extracción del contenido de la página
page_content = await page.content()

# Análisis del contenido HTML
parser = html.fromstring(page_content)

Paso 4: Extracción de datos

Extraiga los puntos de datos necesarios (por ejemplo, título, canal, comentarios) utilizando expresiones XPath.

Recopile todos los datos relevantes, incluidos los metadatos de vídeo y los comentarios.

# Extracción de datos 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()')

Paso 5: Guardar los datos

Guarde los datos extraídos en un archivo CSV para facilitar su análisis y almacenamiento.

# Guardar los datos en un archivo 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)])

Implementación del proxy

Los proxies juegan un papel crucial en el scraping web, especialmente cuando se trata de extracción de datos a gran escala o sitios con estrictas medidas anti-bot como YouTube. He aquí cómo se implementan los proxies en el script de Playwright:

Configuración del proxy:

  1. El parámetro proxy en playwright.chromium.launch() se utiliza para enrutar todo el tráfico del navegador a través de un servidor proxy especificado.
  2. Se deben configurar los detalles del servidor proxy, incluida la dirección del servidor, el nombre de usuario y la contraseña.

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

Ventajas de usar proxies:

  • Enmascaramiento de IP: los proxies ocultan tu dirección IP original, reduciendo la probabilidad de ser bloqueado.
  • Distribución de solicitudes: al rotar los proxies, puedes distribuir las solicitudes entre diferentes direcciones IP, imitando el tráfico de varios usuarios.
  • Acceso a contenidos restringidos: los proxies pueden ayudar a eludir restricciones regionales o acceder a contenidos que podrían estar limitados a determinados rangos de IP.

Esta implementación garantiza que tus actividades de scraping tengan menos probabilidades de ser detectadas y bloqueadas por los mecanismos anti-bot de YouTube.

Implementación completa del código

A continuación se muestra el código completo para scrapear datos de vídeo de YouTube utilizando Playwright y lxml, incluyendo la implementación del proxy.

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

# Función asíncrona para ejecutar Playwright y extraer datos
async def run(playwright: Playwright) -> None:
    # Inicio del navegador headless con configuración 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 a la URL del vídeo de YouTube
    await page.goto("https://www.youtube.com/watch?v=Ct8Gxo8StBU", wait_until="networkidle")

    # Desplazarse hacia abajo para cargar más comentarios
    for _ in range(20):
        await page.mouse.wheel(0, 200)
        await asyncio.sleep(0.2)
    
    # Dar tiempo a que se cargue el contenido adicional
    await page.wait_for_timeout(1000)
    
    # Extracción del contenido de la página
    page_content = await page.content()

    # Cerrar navegador
    await context.close()
    await browser.close()

    # Análisis del contenido HTML
    parser = html.fromstring(page_content)

    # Extracción de datos 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 los datos en un archivo 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)])

# Ejecución de la función asíncrona
async def main():
    async with async_playwright() as playwright:
        await run(playwright)

asyncio.run(main())

He aquí un tutorial paso a paso sobre el uso de Python, Playwright y lxml para el scraping de diversos datos de vídeo de YouTube, incluidos los comentarios. Para ello, se utilizan proxies y se ejecuta código para simular el comportamiento de los navegadores con el fin de raspar datos dinámicos de forma eficaz, respetando al mismo tiempo las mejores prácticas de raspado. Si necesitas información para realizar análisis o crear conjuntos de datos, estos métodos te ayudarán a superar las dificultades a las que te enfrentas en la plataforma de YouTube.

Comentarios:

0 Comentarios