Este proyecto describe el proceso técnico para recolectar datos de la plataforma Douban Movie utilizando el framework Scrapy, seguido de un análisis estadístico y visualización de resultados mediante librerías de Python. El objetivo es procesar tanto el ranking histórico de las mejores 500 películas como las producciones más destacadas entre 2016 y 2021.
Implementación del Crawler con Scrapy
Para obtener el listado histórico de las mejores 500 películas, se identifica que Douban no ofrece una URL única para este ranking masivo, por lo que se recurre a la segmentación por etiquetas y peticiones AJAX que devuelven objetos JSON.
Lógica del Spider
- Extracción inicial de IDs y títulos mediante peticiones asíncronas (paginación de 20 elementos).
- Generación dinámica de URLs para las páginas de detalles de cada película.
- Procesamiento de la respuesta HTML mediante selectores XPath para extraer metadatos (año, director, país, calificación, etc.).
- Almacenamiento de los resultados en archivos CSV a través de un Pipeline personalizado.
import scrapy
import json
from ..items import PeliculaItem
class DoubanCrawler(scrapy.Spider):
name = "douban_films"
allowed_domains = ["movie.douban.com"]
base_query_url = "https://movie.douban.com/j/search_subjects?type=movie&tag={}&sort=recommend&page_limit=20&page_start={}"
def start_requests(self):
categoria = '豆瓣高分' # Películas con alta calificación
for index in range(0, 500, 20):
yield scrapy.Request(
url=self.base_query_url.format(categoria, index),
callback=self.parse_list
)
def parse_list(self, response):
data = json.loads(response.text)
for element in data.get('subjects', []):
detail_url = f"https://movie.douban.com/subject/{element['id']}/"
yield scrapy.Request(detail_url, callback=self.extract_details)
def extract_details(self, response):
item = PeliculaItem()
item['titulo'] = response.xpath('//span[@property="v:itemreviewed"]/text()').get()
item['anio'] = response.xpath('//span[@class="year"]/text()').get().strip('()')
item['director'] = response.xpath('//div[@id="info"]/span[1]//a/text()').get()
item['puntaje'] = response.xpath('//strong[@property="v:average"]/text()').get()
item['pais'] = self.parse_metadata(response, "制片国家")
yield item
def parse_metadata(self, response, key):
info_text = response.xpath('//div[@id="info"]//text()').getall()
for i, text in enumerate(info_text):
if key in text:
return info_text[i+1].strip()
return "N/A"
Recolección de Comentarios y Críticas
Para profundizar en el análisis, se extraen las reseñas de películas seleccionadas. Debido a las restricciones de la plataforma (Anti-scraping), se implementan retardos aleatorios y rotación de cabeceras.
class ReviewCrawler(scrapy.Spider):
name = "movie_reviews"
def start_requests(self):
# IDs de películas seleccionadas para análisis de sentimiento
target_ids = {'25662329': 'Zootopia', '26387939': 'Dangal'}
for movie_id, name in target_ids.items():
for page in range(0, 200, 20):
url = f"https://movie.douban.com/subject/{movie_id}/comments?start={page}&limit=20&status=P&sort=new_score"
yield scrapy.Request(url, callback=self.parse_comments, meta={'movie_name': name})
def parse_comments(self, response):
nodes = response.xpath("//div[@class='comment']")
for node in nodes:
yield {
'pelicula': response.meta['movie_name'],
'usuario': node.xpath("./h3/span[@class='comment-info']/a/text()").get(),
'contenido': node.xpath("./p/span/text()").get().strip(),
'votos': node.xpath("./h3/span[@class='comment-vote']/span/text()").get()
}
Visualización y Análisis Estadístico
Utilizando Pandas para la limpieza de datos y Pyecharts para la generación de gráficos interactivos, se obtuvieron las siguientes conclusiones:
Distribución Geográfica de la Producción
Al mapear la cantidad de películas por país de origen en el periodo 2016-2021, se observa que Estados Unidos, Japón, China y Francia lideran el volumen de producción dentro del Top 500. El mercado occidental y el de Asia Oriental dominan ampliamente la industria global según los usuarios de Douban.
#### Comparativa: China vs. Estados Unidos
Se analizó la evolución anual de las producciones de ambos países. Aunque EE. UU. mantiene un volumen superior, se nota una tendencia creciente en el cine chino a partir de 2018. Curiosamente, tras el impacto de la pandemia en 2019, la producción estadounidense en el ranking disminuyó, mientras que la china mostró resiliencia.
#### Análisis de Géneros y Calificaciones
El uso de gráficos de dispersión permite identificar la relación entre el género, la calificación promedio y el volumen de críticas. Géneros como Drama, Comedia y Romance son los más frecuentes. Sin embargo, géneros como "Música" o "Infantil" suelen tener calificaciones promedio más altas a pesar de tener menos títulos, mientras que el género de "Terror" prseenta menor popularidad y puntuaciones más bajas en promedio.
### Análisis de Sentimiento y Nube de Palabras
Para las películas que coinciden tanto en el ranking histórico como en el reciente, se aplicó la librería SnowNLP para determinar la polaridad de las críticas (Positivo > 0.66, Negativo < 0.33).
from snownlp import SnowNLP
import pandas as pd
def analizar_sentimiento(file_path):
df = pd.read_csv(file_path)
polaridad = {'positivo': 0, 'negativo': 0, 'neutral': 0}
for texto in df['contenido']:
analisis = SnowNLP(str(texto))
if analisis.sentiments > 0.66:
polaridad['positivo'] += 1
elif analisis.sentiments < 0.33:
polaridad['negativo'] += 1
else:
polaridad['neutral'] += 1
return polaridad
Los resultados indicaron que las películas de alto rendimiento (como Zootopia o Dangal) mantienen una tasa de comentarios positivos superior al 80%. Las nubes de palabras generadas revelan que los temas centrlaes que resuenan con la audiencia incluyen "humanidad", "crecimiento" y "emoción".
### Conclusiones Técnicas
- El cine de Hollywood sigue siendo el referente en volumen, pero el cine chino ha ganado terreno en términos de calidad percibida y presencia en rankings recientes.
- La diversidad de géneros en el Top 500 está altamente concentrada en drama, reflejando una preferencia del público por narrrativas profundas sobre el espectáculo puro.
- La ley de Pareto se cumple en la industria: un pequeño porcentaje de directores y actores son responsables de la gran mayoría de los éxitos críticos.