Problema publicidad y PhantomJS

Traber

Buenas, staff de MV,

Estoy desarrollando una aplicación en la nube para, entre otras cosas, monitorizar webs, y como soy un asíduo de MV, una de las webs con las que estoy testeando el monitor es MV (es solo un PhantomJS tomando capturas de la web, espero que no os lo toméis a mal :P).

El problema es que, de manera aleatoria, el PhantomJS me tira un error "408 - Request Timeout" de las peticiones HTTP, y es que, por lo visto, la publicidad termina por redirigir el navegador a una página externa (con javascript, he de suponer), lo cual me tira por tierra 1 de cada 4 veces que se comprueba la web.

Varios ejemplos de redirecciones por publicidad:

spoiler

Y aquí, lo que se supone debería aparecer con una petición correcta:

spoiler

Si en lugar de utilizar PhantomJS utilizo CURL o WGET no me tira estos problemas porque no procesa el javascript, pero claro, no podría obtener las capturas (que es el principal motivo por el cual tiro de PhantomJS)... ¿Puede ser efectivamente un problema de la publicidad de la web? ¿O el problema tiene que ver más con PhantomJS?

¡Saludos!

Mujiwara

Haz un cURL, guarda el resultado e imprimelo en una ruta tuya para pillarlo con el PhantomJS

1 respuesta
Traber

#2 Es una idea, pero con ello tendría que cachear localmente todos los recursos, o las URLs relativas de CSS, Javascript e imágenes me tirarán errores 404, cosa que tampoco es deseable... Y claro, cachear localmente todos los recursos de una web solo para hacer una captura en JPG es una locura xD. Para eso tengo otro proyecto por separado...

Mujiwara

Editas el <head> y le metes la etiqueta <base> para mandar todas las rutas relativas a mediavida y eliminas el script js en plan filtro

1 respuesta
Traber

#4 Mmmmm... Pero eso implicaría varias cosas:

  • Cachear localmente el HTML, modificarlo (preferiblemente mediante DOM, en lugar de RegExp que a priori puede parecer más rápido y sencillo, pero más propenso a fallos), y guardarlo de nuevo.
  • Volver a procesar el fichero con PhantomJS.

Este doble procesado aumentaría el tiempo de comprobación por cada web. Además, cargarse los scripts trae varios problemas:

  • Eliminar los scripts en javascript puede llevar a que, una web basada fuertemente en javascript (que use "lazy loading", por ejemplo) se renderice mal, y las capturas se hagan mal.
  • También puede llevar a que las webs que utilicen sistemas de carga dinámica de recursos (como hojas de estilo CSS) mediante Javascript se rendericen mal.

Obviamente, esto no es lo deseable, lo mejor sería renderizar la web igual que lo haría el navegador en sí y hacer la captura. Lo malo es que ocurra esto, que la publicidad te saque fuera (aquí y en cualquier web).

Mujiwara

Prueba a hacer el PhantomJS con la cabecera (header) de Googlebot (quizás el script rechaza la solicitud al ser un bot de indexación) ó lanzar el PhantomJS junto un filtro de urls bloqueadas (como hace adblock) aunque desconozco el funcionamiento del PhantomJS pero supongo que podrás bloquear los recursos ó capturar el resultado (html) y procesarlo para filtrar la publicidad.

1 respuesta
Traber

#6 Agradezco tus sugerencias de veras, lo acabaré probando a ver si así me paso por el forrete la publicidad, la cosa es que, si a mi PhantomJS le pasa, siendo como un Chrome (webkit realmente) recién instalado sin AdBlock ni similares, le puede pasar a cualquier usuario. Vamos, que lo que quiero más que "oye, estoy haciendo esto y no me funciona, ayuda" es "oye, que estoy haciendo esto, me he dado cuenta de que a veces me pasa esto otro (redureccion de la publicidad) y que le puede estar pasando a más usuarios" :P.

Luego ya, si el problema no está en la publi de MV sino en cómo procesa el JS el PhantomJS es cuando me tocará ponerme manos a la obra para solucionarlo, pero como digo, gracias por las ideas :D.

1 respuesta
RaymaN

#7 hombre, si nadie ha reportado una redirección del navegador es que será problema de PhantomJS. El 90% de peticiones de publicidad tienen redirecciones y nuevas peticiones por medio, puede que el Phantom se haga la picha un lío y acabe redireccionando la petición principal.

1 respuesta
gohrum

#1 haz blacklist de las url / url de redirección de publicidad.
O incluso, haz screens con adblock xD

1 respuesta
Traber

#8 Me imagino que efectivamente será problema del PhantomJS que, como dices, se volverá loco con las redirecciones de los scripts de publicidad... Solo quería preguntar por ver si sonaba la campana y, o bien es un problema reciente con la publicidad, o a alguien le había pasado y se trataba de alguna gilipollez XD.

#9 Si sabes como meter algo al PhantomJS tipo AdBlock o similar encantado de saberlo, porque lo poco que he buscado no he visto nada parecido xD. Se me ocurre meter la lista negra de AdBlock en los HOSTS del servidor, pero eso es matar la mosca a cañonazos, y un poco movida porque hay cosas que vienen de CDNs que puede bloquear el AdBlock y tampoco me interesa meter un bloqueo tan grande a ese nivel del servidor entero... No es la primera vez que he tenido que desactivar el AdBlock en la web de un cliente para que me descargue un JS y poder ver la web bien :palm:, así que preferiría bloquearlo de otra manera...

Traber

Bueno, tras estar un día erre que erre viendo qué le pasaba al PhantomJS, efectivamente era problema del susodicho, y es que en uno de los eventos ("onResourceTimeout", vamos, el error que me salía, un timeout) me metía lo siguiente:

response        = error;
response.status = error.errorCode;

El problema viene de que utilizo un wrapper de PHP para PhantomJS llamado php-phantomjs, y entre otras cosas, ya tiene establecidos algunos filtros, entre ellos el que menciono de "onRequestTimeout", que era lo que me fastidiaba todo.

El muy mamón me cambiaba TODA la petición HTTP si en uno de los recursos (CSS, JS, imágenes, etc...) se producía un timeout, muy rico todo xD. Lo raro es que solo me pasaba con Mediavida, que era lo que me escamaba... Pero bueno, me he cargado ese listener y au, a funcionar de nuevo xD.

Eso sí, he tomado la sugerencia de lo del AdBlocker y me he hecho un pequeño filtro para, de momento, bloquear el Google Analytics (así no deja rastro en el panel de analytics, dado que, realmente, no es una visita como tal, sino una especie de scrapper):

page.onResourceRequested = function (requestData, networkRequest) {
	if ((/google-analytics\.com/gi).test(requestData['url'])){
		networkRequest.abort();
    }
};

Gracias a todos por la ayuda :)

Usuarios habituales

  • Traber
  • gohrum
  • RaymaN
  • Mujiwara

Tags