tutorial scraping medium examples example español python ajax screen-scraping scrapy web-crawler

medium - web scraping python examples



¿Analizar las respuestas de ajax para recuperar el contenido final de url en Scrapy? (1)

Puede usar una cadena de funciones de devolución de llamada que comienza para la función de devolución de llamada principal, digamos que está implementando una araña que extiende BaseSpider, escriba su función de análisis de la siguiente manera:

... def parse(self, response): #other code yield Request (url=self.baseurl, callback=self.first_dropdown) def first_dropdown (self, response): ids=self.parse_first_response() #Code for parsing the first dropdown content for (i in ids): req_url=response.url+"/?location="+i yield Request (url=req_url, callback=self.second_dropdown) def second_dropdown (self, response): ids=self.parse_second_response() #Code for parsing the second dropdown contents url=self.base_url for (i in ids): req_url=response.url+"&section="+i yield Request (url=req_url, callback=self.third_dropdown) ...

la última función de devolución de llamada tendrá el código necesario para extraer sus datos.

Tenga cuidado, está pidiendo probar todas las combinaciones posibles de entrada y esto puede llevarlo a un gran número de solicitudes muy rápido.

Tengo el siguiente problema:

Mi raspador comienza en una URL "base". Esta página contiene un menú desplegable que crea otro menú desplegable a través de llamadas ajax, y esto en cascada 2-3 veces hasta que tenga toda la información necesaria para llegar a la página "final" donde está el contenido real que quiero raspar.

En lugar de hacer clic en cosas (y tener que usar Selenium o similar) utilizo las páginas expuestas API JSON para imitar este comportamiento, así que en lugar de hacer clic en las listas desplegables simplemente envío una solicitud y leo respuestas JSON que contienen la matriz de información utilizada para generar la siguiente contenido desplegable, y haz esto hasta que tenga la URL final para un artículo. Esta URL me lleva a la página final del artículo que realmente quiero analizar.

Estoy confundido acerca de cómo usar Scrapy para obtener la url "final" para cada combinación de cuadros desplegables. Escribí un rastreador usando urllib que usaba una tonelada de bucles para simplemente iterar a través de cada combinación de url, pero Scrapy parece ser un poco diferente. Me alejé de urllib y lxml porque Scrapy parecía una solución más fácil de mantener, que es más fácil de integrar con los proyectos de Django.

Esencialmente, estoy tratando de obligar a Scrapy a tomar un camino determinado que genero mientras leo los contenidos de las respuestas json, y solo analizo la última página de la cadena para obtener contenido real. Necesita hacer esto para cada página posible, y me encantaría paralelizarlo para que las cosas sean eficientes (y use Tor, pero estos son problemas posteriores).

Espero haber explicado esto bien, avíseme si tiene alguna pregunta. ¡Muchas gracias por tu ayuda!

Editar: se agregó un ejemplo

[base url]/?location=120&section=240

devoluciones:

<departments> <department id="62" abrev="SIG" name="name 1"/> <department id="63" abrev="ENH" name="name 2"/> <department id="64" abrev="GGTH" name="name 3"/> ...[more] </departments>

Luego tomo el ID del departamento y lo agrego a la url como sigue:

[base url]/?location=120&section=240&department_id=62

devoluciones:

<courses> <course id="1" name="name 1"/> <course id="2" name="name 2"/> </courses>

Esto continúa hasta que termino con el enlace real al listado.

Esto es esencialmente lo que parece en la página (aunque en mi caso, hay un botón de "enviar" final en el formulario que me envía a la lista real que quiero analizar): http://roshanbh.com.np /desplegable/

Por lo tanto, necesito una forma de eliminar todas las combinaciones de las listas desplegables para que obtenga todas las páginas posibles de la lista. El paso intermedio de recorrer las respuestas ajax xml para generar las URL finales de la lista me está arruinando.