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?
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ónITEM_PIPELINES
en el diccionariocustom_settings
. Aquí tienes un ejemplo:En este ejemplo, estamos accediendo a la clave de configuración
ITEM_PIPELINES
de la claseSpider
, 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 deITEM_PIPELINES
en el diccionariocustom_settings
de nuestra araña. Esto agregará nuestra tubería personalizada a las tuberías existentes cuando se ejecute esta araña.