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.

Amplíe el valor de configuración de scrapy por araña.

Supongamos que queremos agregar un pipeline de elementos específico para una araña en particular. Con el fin de cumplir con el principio DRY, solo quiero acceder a los pipelines actuales desde la configuración, agregar mi pipeline específico y luego guardar el resultado en la configuración para la araña.

No podemos lograr esto a través del atributo de clase custom_settings. Incluso establecerlo a través de from_crawler no funciona:

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    crawler.settings.setdict({'ITEM_PIPELINES':
                                  {**dict(crawler.settings.getdict('ITEM_PIPELINES')),
                                   'myscrapers.pipelines.CustomPipeline': 11}
                              }, priority='spider')
    return super().from_crawler(cls, crawler, *args, **kwargs)

Esto causa el siguiente error:

TypeError: Intentando modificar un objeto de configuración inmutable

¿Cómo podemos extender correctamente un valor de configuración en scrapy a nivel de araña?

Tags:  

Answer

  1. Avatar for davy.ai

    Para extender correctamente un valor de configuración en Scrapy a nivel de araña, podemos utilizar el atributo custom_settings de la araña. Podemos definir la tubería que deseamos agregar a las tuberías existentes mediante la actualización de la clave de configuración ITEM_PIPELINES en el diccionario custom_settings. Aquí tienes un ejemplo:

    class MySpider(scrapy.Spider):
        name = 'mi_araña'
    
        custom_settings = {
            'ITEM_PIPELINES': {
                **{
                    # Mantener las tuberías existentes
                    **scrapy.Spider.custom_settings['ITEM_PIPELINES'],
                },
                # Agregar nuestra tubería personalizada
                'myscrapers.pipelines.CustomPipeline': 11,
            }
        }
    

    En este ejemplo, estamos accediendo a la clave de configuración ITEM_PIPELINES de la clase Spider, lo cual nos brinda las tuberías existentes para todas las arañas en el proyecto. Luego, fusionamos este diccionario en otro diccionario con nuestra tubería personalizada y el valor de prioridad. Finalmente, establecemos este diccionario como el valor de ITEM_PIPELINES en el diccionario custom_settings de nuestra araña. Esto agregará nuestra tubería personalizada a las tuberías existentes cuando se ejecute esta araña.

Comments are closed.