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.

Asignar una variable a una función de devolución de llamada con “yield”.

En Scrapy

Tengo dos funciones, al principio se llama a parse() y luego se llama a parse_each() en parse().

class UtamapSpider(scrapy.Spider):
    def parse(self, response):
        yield scrapy.Request(url=each_url, callback=self.parse_each)

    def parse_each(self,response):

Ahora, quiero pasar algunos parámetros adicionales a parse_each.
Entonces, lo que quiero hacer es esto.

class UtamapSpider(scrapy.Spider):
    def parse(self, response):
        yield scrapy.Request(url=each_url, callback=self.parse_each(99)) #ejemplo de pasar el valor `99`

    def parse_each(self,response,myvalue):
        print(myvalue) # 99 

Me temo que puede ser imposible, pero ¿hay alguna forma de pasar los datos adicionales a la función de devolución de llamada?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible pasar datos adicionales a la función de devolución de llamada en Scrapy. Una forma de hacerlo es usando el parámetro cb_kwargs al llamar a scrapy.Request() en parse(). El parámetro cb_kwargs permite pasar un diccionario de argumentos clave a la función de devolución de llamada. Aquí tienes un ejemplo:

    class UtamapSpider(scrapy.Spider):
        def parse(self, response):
            myvalue = 99
            yield scrapy.Request(url=each_url, callback=self.parse_each, cb_kwargs=dict(myvalue=myvalue))
    
        def parse_each(self, response, myvalue):
            print(myvalue) # 99
    

    En este ejemplo, la variable myvalue está definida en parse() y se pasa a parse_each() utilizando cb_kwargs=dict(myvalue=myvalue) en la llamada a scrapy.Request().

    Alternativamente, también puedes usar funciones parciales del módulo functools para pasar argumentos adicionales a la función de devolución de llamada. Aquí tienes un ejemplo:

    from functools import partial
    
    class UtamapSpider(scrapy.Spider):
        def parse(self, response):
            myvalue = 99
            yield scrapy.Request(url=each_url, callback=partial(self.parse_each, myvalue=myvalue))
    
        def parse_each(self, response, myvalue):
            print(myvalue) # 99
    

    En este ejemplo, se utiliza la función partial() para crear una nueva función que contiene el argumento myvalue, el cual se pasa como función de devolución de llamada a scrapy.Request().

Comments are closed.