Archivo de 'bobapp'

Capturador de enlaces de Películas Yonkis

AVISO IMPORTANTE: Script obsoleto

Desde que el diseño de Películas Yonkis cambió, el script que desarrollé y que hay aquí colgado, se ha quedado obsoleto. Sería necesario reajustar las expresiones regulares. Ignoro si hay más cambios (como nuevas “trampas” en JavaScript).

Por favor, si has creado una versión actualizada, compártelo y añado una referencia a la URL donde lo tengas alojado.

¡Cuantísimo tiempo sin escribir! Por suerte o por desgracia, últimamente tengo muy poco tiempo para mí. Recientemente se han visto varias noticias sobre cómo dejar de depender de páginas de enlaces como Series Yonkis y compañía. Al hilo de ese asunto, alguien redactó el Proyecto Communis. En resumen consiste en crear una base de datos única con todos los enlaces a descargas. De esa base de datos podrán beber todos los servicios que lo deseen. En mi opinión, ése no es el camino a seguir; seguiría siendo un sistema centralizado, en tanto que tanto los ficheros como la base de datos estarían alojadas en algún servidor en particular. Es un sistema muy débil, pero es el que venimos usando ahora. La solución pasa por volver a un sistema completamente descentralizado como es el P2P.

Ahora bien, las páginas de descargas son hoy por hoy la solución más eficaz para acceder a los contenidos. En concreto, la web que más tráfico tiene (y entiendo que la mayor base de datos también) es Películas Yonkis. Y no sé a vosotros, pero a mí no me gusta, no me gusta nada. Está inundada de screeners, audios en latino, o versiones originales. No hay nada malo en ello, siempre y cuando hubiera alguna forma eficaz de poder filtrar contenidos. Y como no existe, pues me he hecho un programa (sí, otro más) para descargar su base de datos. Luego tengo una web de uso personal para yo (y mi señor padre) poder localizar esos enlaces.

Os presento mi script capturador de Películas Yonkis: crawler.php

Funciona igual que el que desarrolló Carlos Capote para Series Yonkis: Un script se encarga de descargar documentos web, y mediante expresiones regulares, captura su contenido. Finalmente, se salta la protección javascript ejecutando javascript en consola (con SpiderMonkey).

Características

Como principales características tiene:

  • Funciona en PHP, de modo que se puede ejecutar en prácticamente cualquier servidor web.
  • Es únicamente para Películas Yonkis, aunque está hecho de forma que sea fácilmente extensible para añadir otros portales (próximamente, CineTube).
  • Guarda una copia local en SQLite.
  • Puede ejecutarse en busca de nuevos enlaces. Sólo lleva unos segundos, ya que mediante peticiones HEAD comprueba si la URL ya se ha analizado: para ello, almacena una lista de URLs y sus cabeceras ETag y last-modified.
  • Evita duplicados, ya que almacena en base de datos cada URL de descarga.

Únicamente tiene dos dependencias: SpiderMonkey y cURL para PHP.

Base de datos

La base de datos tiene dos tablas, Movies y Movie_Links:

Movies:

  • id – identificador numérico.
  • title – Título de la película.
  • year – Valor numérico para el año.
  • description – Sinopsis.
  • genres – Lista separada por comas de géneros.

Movie_Links:

  • id – Identificador numérico.
  • movie_id – Identificador de la película a la que pertenece.
  • urls – Lista de URLs de esta descarga. En la mayoría de los casos será sólo una, pero hay películas que están divididas en partes.
  • lang – Idioma.
  • subs – Indica si tiene o no subtítulos.
  • quality – Calidad, de 1 a 5.
  • length – Duración en minutos.
  • enc – Método de codificación, por ejemplo DVD-Rip o Screener.
  • size – Tamaño total en MB.
  • format – Formato del fichero, por ejemplo AVI.
  • resolution – Resolución de salida.
  • type – Indica si es descarga directa o visualización online.
  • service – Almacena el servicio utilizado, por ejemplo, megaupload, megavideo, veoh, fileserve, etc.
  • broken – No usado todavía, sirve para notificar si un enlace está roto.

Y aquí dejo una copia de la base de datos (14.85MB). Puedes descargarla y ejecutar:
$ sqlite3 peliculas.db

Supongamos que queremos consultar todas las pelis de ciencia ficción que estén en megaupload, en DVD-Rip y en español de España, podríamos ejecutar:

$ sqlite3 peliculas.db
SQLite version 3.6.12
Enter SQL statements terminated with a ";"
sqlite> select distinct(m.title)
from movies m, movie_links ml where
ml.movie_id = m.id
and enc="DVD-Rip"
and genres like "%ciencia%"
and lang="spanish"
and service="Megaupload";

Bobapp – Cifras de tráfico a partir de Google Trends

¡Hola amigos! Hoy vamos a aprender cómo obtener las cifras de tráfico de una web gracias a la herramienta Google Trends. Esta herramienta, para generar la gráfica, utiliza la API de gráficas Google Charts, por lo que sólo es necesario entender el “idioma” que esta API habla para poder extraer cifras aproximadas del tráfico de una web.

De paso introduzco una nueva sección: Bienvenidos a Bobapp! El apartado donde colgaré aplicaciones bobas que se me ocurran :)

Volviendo a lo que nos atañe: Para consultar el tráfico de una página hay que hacer lo siguiente:

  1. Accedes a Google Trends.para páginas web.
  2. Si no has iniciado sesión con tu usuario, hazlo ahora. Este paso es necesario.
  3. Consulta el tráfico de una página. Una y no más.
  4. Copia la URL en la que se encuentra la gráfica.
  5. Accede a http://chusete.es/bobapp/gtrends.php.
  6. Pega la URL de la gráfica y dale a Enviar.
  7. Obtendrás una tablita con las cifras de tráfico y el error cometido.

Esta bobapp está dedicada a mi grán amigo Simón, amante y estudioso de las métricas de tráfico :)

Y para los curiosos aquí tenéis el código fuente de la función “que hace la magia”:

  function get_traffic($chart_url) {
    // Construimos el array con las correspondencias numéricas
    for($j=0, $i=65;$i<=90;$i++) { $chdata[chr($i)] = $j++; }
    for($i=97;$i<=122;$i++) { $chdata[chr($i)] = $j++; }
    for($i=0;$i<=9;$i++) { $chdata[$i] = $j++; }

    /* Obtenemos las fechas de cada valor. Se muestran los últimos 22
      meses completos, y de ellos, 56 valores. Transcurren
      aproximadamento 12 días entre cada valor */
    $last_date = strtotime('-1 second',
      strtotime(date('m').'/01/'.date('Y').' 00:00:00'));
    $first_date = strtotime(date('m/01/Y 00:00:00',
      strtotime('-22 month', $last_date)));
    $date_increment = ($last_date - $first_date) / (55);

    // Parseamos la URL
    $url_parsed = parse_url(html_entity_decode($chart_url));
    parse_str($url_parsed['query'], $params);

    /* Cada división horizontal es 1/3 de la cota máxima. Obteniendo
      la mínima, multiplicamos por 3, y por M o por K (Depende), y
      dividimos entre la resolución, que es de hasta 61 posiciones.
      Este valor será el factor que defina cada incremento. El error
      cometido será la mitad del incremento */
    preg_match_all('/t (\d+\.?[0|5]?) (K|M)/i',$params['chm'],$cota);
    $rango = $cota[2][1]=='M' ? 1000000 : 1000;
    $inc = (3*min($cota[1])*$rango)/61;

    // Obtenemos el Array de datos
    preg_match('/([^,]+)$/i', $params['chd'], $orig);
    $data = Array();

    // Y finalmente, asignamos los valores al array de retorno
    $size = strlen($orig[1]);
    for($i=0; $i<$size;$i++) {
      $index = date('Y-m-d', $first_date + $date_increment*$i);
      $value = number_format($chdata[$orig[1][$i]]*$inc,0,',','.');
      $data[$index] = $value;
    }
    $data['Error'] = '± '.number_format($inc/2, 2, ',', '.');

    return $data;
  }

Como véis es muy sencillo. Si quitamos los comentarios y lineas partidas se queda en sólo 19 líneas de código.