es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python Scrapy | Cómo pasar la respuesta a la función principal desde la araña

He intentado buscar una solución en Google extensivamente, pero puede que no esté utilizando las palabras clave correctas. Soy consciente de que puedo usar la terminal para trabajar con selectores CSS y XPath inmediatamente, pero me gustaría saber si es posible hacerlo en el entorno del IDE fuera de la clase “spider”, es decir, en otra celda.

Código de ejemplo:

class ExampleSpider(scrapy.Spider):
    name = "exampleSpider"
    start_urls = ["https://www.example.com"]

Luego quiero poder trabajar con esta respuesta y los selectores en otra celda:

table_rows = response.xpath("//div[@class='example']/table/tr") # produce un error
print(table_rows.xpath("td[4]//text()")[0].get())

produce el error:

NameError: name 'response' is not defined

Cualquier ayuda/orientación sería muy apreciada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible trabajar con la respuesta y los selectores fuera de la clase de araña en otra celda. Esto se debe a que el objeto de respuesta es específico de la clase de araña y su método de análisis. No es global y no se puede compartir fuera de la clase.

    Si necesitas trabajar con el objeto de respuesta en otra celda, deberás pasarlo como parámetro o almacenarlo en una estructura de datos que pueda ser accedida desde fuera de la clase. Una forma de hacer esto es guardar el objeto de respuesta como un elemento de Scrapy, el cual puede ser accedido fuera de la clase de araña.

    Aquí tienes un ejemplo de cómo guardar el objeto de respuesta como un elemento:

    class ExampleSpider(scrapy.Spider):
        name = "exampleSpider"
        start_urls = ["https://www.example.com"]
    
        def parse(self, response):
            item = {"response": response}
            yield item
    

    Luego, en otra celda, puedes acceder al objeto de respuesta desde el elemento:

    item = <recuperar el="" elemento="" de="" la="" salida="" de="" la="" araña="">
    response = item["response"]
    filas_tabla = response.xpath("//div[@class='example']/table/tr")
    print(filas_tabla.xpath("td[4]//text()")[0].get())
    

    Ten en cuenta que deberás recuperar el elemento de la salida de la araña (por ejemplo, usando scrapy crawl -o output.json) y cargarlo en tu cuaderno para poder acceder al objeto de respuesta.

Comments are closed.