Dudas crawling, bot, extensiones, headless browsers en android o qué?

Iniciado por @XSStringManolo, 8 Agosto 2019, 06:46 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Varias questiones acerca de crawling. No tengo idea del tema. Voy a intentar organizar bien las preguntas y contexto para no hacer sharing de mi cacao mental...

Cómo puedo detectar automáticamente si el sitio es crawling/scraping-friendly?

Se suele indicar en algún sitio de forma frecuente?

Me acuerdo de hace tiempo que iba a usar un crawler junto a un bot en este foro y leí por las normas del sitio que no estaba permitido. No sé ni en donde xD. No sabía ni que se solía prohibir esta actividad.
Básicamente como sé si se permite o no, o si voy a tener problemas xD?  Me gustaría abrirle la puerta al crawler para que salga a pasear por ahí como quien suelta un perro y le trae trufas. Jejeje.

Básicamente quiero usar el crawler principalmente para descargar contenido del sitio y de links apuntados por el sitio mientras me hecho la siesta o salgo de casa, desde el android, por eso del límite de velocidad de los datos e ir generando caché para cargar más rápido los sitios o poder verlos offline o no, obtener data para analisis...

Quiero programarlo a mano solo con javascript con la idea en mente de ejecutarlo directamente en el navegador pero no quiero usar ninguna tecnología que use node.js porque no puedo usarlo en X dispositivos y no quiero usar hosting de ningún tipo.

Entonces como me salto la politica de origen de un sitio random?
No quiero instalar extensiones de terceros.

Podría hacer yo una extensión para el navegador (chrome, mozilla) para saltarme la política con javascript vanilla?

Nunca hice una y ni idea de como va el tema, si teneis info dpm.
O me recomendais algún navegador headless directamente y de fiar para Android que no use node.js Aunque no tengo claro que me sirva para hacer lo que necesito.

Porque también quiero usar el crawler conjuntamente con un modulo que se coloca en local para interceptar y modificar respuestas http a páginas http only con javascript para crawlear páginas de acceso al router y obtener la pass. (No pregunteis porque quiero crawlear la página del router a parte de sacar la pass xD)
Ahí también tengo problemas con la politica del mismo origen pero al estar en local y poder embeber la página con un iframe, tras interceptar la respuesta y eliminar la parte de la cabecera que hace Deny en X-frame antes de forward no tengo problema para crawlear en local no?

El iframe me sirve tambien para que el crawler obtenga todo el contenido de la web o al estar en un iframe o no se puede? (No tengo ni idea.)

Y sin poder interceptar las respuestas alguna alternativa para no tener que usar el script del server? Me crashea mucho, es una patata.

Estoy resumiendo todo mucho y estoy bastante perdido con algunas cosas más.

engel lex

CitarCómo puedo detectar automáticamente si el sitio es crawling/scraping-friendly?

Creo que te va a hacer falta revisar personalmente, sin embargo, si vez que el "consumible" (artículo, tema, etc) tiene alguna clase de identificador (numerico o. Alfanumerico) continuo por ejemplo ccca, cccb, cccc, cccd....

si usa guid, o el identificador es no continuo tendrás que ver si tiene algun listado de donde guiarte

CitarQuiero programarlo a mano solo con javascript con la idea en mente de ejecutarlo directamente en el navegador

Va a ser muy lento a menos que estes dispuesto a revisar solo decenas por segundo... Yo recomendaría python, segun tu red podrías analizar cientos o miles por segundo a demas usar multihilo y peticiones paralelas mejoraría la velocidad en decenas de veces

Con python tienes requests, o también frameworks como scrapy, etc

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

#!drvy

CitarCómo puedo detectar automáticamente si el sitio es crawling/scraping-friendly?

Normalmente no se hacen sitios "scrapping friendly", se hacen sitios con APIs o Endpoints públicos. Por ejemplo, una forma muy común de dar información al público es mediante SPARQL. En general, todo esto se trata como Web semántica, webs que son capaces de ser leídas tanto por personas como por aplicaciones.

Dos ejemplos que usan sparql pueden ser Wikidata y Datos.gob.es.

CitarBásicamente como sé si se permite o no, o si voy a tener problemas xD?  Me gustaría abrirle la puerta al crawler para que salga a pasear por ahí como quien suelta un perro y le trae trufas. Jejeje.

robots.txt te dice donde "está permitido" y donde no que un bot vaya a minar información. No te dira si permiten los scrapeos como tal, pero es un punto de partida para no tener "problemas" (que tampoco vas a tener muchos a no ser que te pongas a scrapear webs de Tor y resulte que estes scrapeando contenido ... asqueroso).


CitarQuiero programarlo a mano solo con javascript con la idea en mente de ejecutarlo directamente en el navegador pero no quiero usar ninguna tecnología que use node.js porque no puedo usarlo en X dispositivos y no quiero usar hosting de ningún tipo.

Como te ha dicho el compañero, JS va a ser muy lento y vas a tener que resolver problemas como same-origin policy. Por otro lado, puedes ejecutar NodeJS en Android, aunque para scrapping (como ha dicho el compañero) nada mejor que Python.

CitarEntonces como me salto la politica de origen de un usitio random?

Puedes deshabilitarla desde el navegador, el problema lo tendrás en plataformas como en Android donde el navegador está limitado (aunque Firefox creo que no).

CitarPodría hacer yo una extensión para el navegador (chrome, mozilla) para saltarme la política con javascript vanilla?

He desarrollado alguna que otra extensión para Chrome, y lo bueno es que solo tienes que pedir permiso para acceder al contenido de otros sitios web y a partir de ahí puedes hacer lo que te de la gana con la extensión.. podrias hacer una extensión crawler.

CitarO me recomendais algún navegador headless directamente y de fiar para Android que no use node.js Aunque no tengo claro que me sirva para hacer lo que necesito.

Te sirve mucho si vas a querer scrapear contenido dinámico, hay muchos frameworks de scrapeo (o que se usan para tal fin) que usan navegadores headless... un ejemplo es Puppeteer.

CitarAhí también tengo problemas con la política del mismo origen pero al estar en local y poder embeber la página con un iframe, tras interceptar la respuesta y eliminar la parte de la cabecera que hace Deny en X-frame antes de forward no tengo problema para crawlear en local no?

Si vas a crear una extensión, no necesitas nada de eso dado que en el momento en el que tengas permiso de acceso al contenido de otros sitios, lo vas a tratar como si fuese un DOM comun y corriente.

CitarEl iframe me sirve tambien para que el crawler obtenga todo el contenido de la web o al estar en un iframe o no se puede? (No tengo ni idea.)

Por un lado, hay muchos sitios que usan cabeceras explícitas para prohibir los iframe. Por otro lado, acceder al contenido en un iframe, rige por el mismo principio de same-origin policy. Es decir, que si el iframe apunta un dominio diferente, el navegador no te dejará acceder o manipular el iframe.

Citar
Y sin poder interceptar las respuestas alguna alternativa para no tener que usar el script del server? Me crashea mucho, es una patata.

Mejor server. Hay cosas gratuitas.. mirate Heroku por ejemplo.



Saludos

@XSStringManolo

Muchas gracias, prácticamente no conocía nada de la info que pusisteis. Voy a mirarla en profundidad, cualquier duda ante la implementación os comento.  ;-)

MinusFour

Yo me pondría a pensar muy bien en el uso que le vas a dar. Lo que has dicho fue:
Cita de: string Manolo en  8 Agosto 2019, 06:46 AMBásicamente quiero usar el crawler principalmente para descargar contenido del sitio y de links apuntados por el sitio mientras me hecho la siesta o salgo de casa, desde el android, por eso del límite de velocidad de los datos e ir generando caché para cargar más rápido los sitios o poder verlos offline o no, obtener data para analisis...

Y básicamente lo que te entendí que quieres hacer es:

1) "Cache warmup"

Que francamente, es mejor si estableces caches mas agresivas con tus dispositivos (y en lugares que se puedan leer más rápido)

2) Offline viewing

Que es un tremendo dolor de cabeza para sitios web que son dinámicos, porque no solo tienes que obtener los recursos necesarios sino que muy probablemente los tengas que modificar de alguna forma. Por ejemplo, si una pagina web empieza a utilizar fetch o XHR para obtener algunos recursos, es probable que vayas a necesitar montarte un servidor web de por medio o editar el código para que no utilize fetch/XHR. Y considerando que hoy en día el código viene minificado y modularizado te puede resultar díficil encontrar el código en cuestión o hacer alguna especie de monkey patching para que cargue de tu FS. Es más en algunos contextos no te van a permitir eso y lo que es peor te van a forzara usar HTTPS, así que en algunos casos no te va a quedar de otra más que poner un servidor HTTPs (y de paso tienes que agregar un root CA a tu trust store).

Es importante porque dependiendo del error que ocurra puede o no afectar el comportamiento del sitio de manera local. Hay muchas técnicas que algunos sitios web utilizan para usar las paginas de manera offline. Reddit por ejemplo tiene una modalidad offline (y a veces es un lio refrescar información). Es más responsabilidad del sitio web hacerlo visible de manera offline.

En fin, que no es algo que vas a poder hacer para algunos sitios, así que va a tocar investigar como funciona el sitio.

3) Obtener datos en especifico

Mucho más factible que tener una pagina web funcionando de manera local y para esto si te puedes utilizar las herramientas que te han dicho. Pero no hay ninguna panacea para cualquier sitio web. Si es un SPA quizás necesites un headless browser como CasperJS/PhantomJS/Puppeteer/etc, pero igual y puedes usar un parser para HTML (o busquedas en el string) si hacen prerender al sitio web (que deberían porque hay buscadores que no hacen crawling que entienda javascript). Te toca analizar el sitio web en la mayoría de los casos...