Cómo pasar un argumento definido por el usuario en scrapy spider

Estoy tratando de pasar un argumento definido por el usuario a la araña de un scrapy. ¿Alguien puede sugerir sobre cómo hacer eso?

Leí sobre un parámetro -a algún lugar, pero no tengo idea de cómo usarlo.

Los argumentos de araña se pasan en el comando de rastreo usando la opción -a . Por ejemplo:

 scrapy crawl myspider -a category=electronics -a domain=system 

Las arañas pueden acceder a los argumentos en sus inicializadores:

 class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, category='', **kwargs): self.start_urls = ['http://www.example.com/category/%s' % category] super().__init__(**kwargs) # python3 self.log(self.domain) # system 

Tomado del documento de Scrapy: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

Actualización 2013 : agregar un segundo argumento

Actualización 2015 : ajustar la redacción

Actualización 2016 : utilice la clase base más nueva y agregue súper, gracias @Birla

Actualización 2017 : utiliza Python3 super

 # previously super(MySpider, self).__init__(**kwargs) # python2 

Las respuestas anteriores eran correctas, pero no tienes que declarar el constructor ( __init__ ) cada vez que quieras codificar una araña de un scrapy, solo puedes especificar los parámetros como antes:

 scrapy crawl myspider -a parameter1=value1 -a parameter2=value2 

y en tu código de araña puedes usarlos como argumentos de araña:

 class MySpider(Spider): name = 'myspider' ... def parse(self, response): ... if self.parameter1 == value1: # this is True # or also if getattr(self, parameter2) == value2: # this is also True 

Y solo funciona

Los argumentos de araña se pasan mientras se ejecuta el comando de rastreo usando la opción -a. Por ejemplo, si quiero pasar un nombre de dominio como argumento a mi araña, haré esto:

scp crawl myspider -a domain = “http://www.example.com”

Y reciba argumentos en los constructores de araña:

 class MySpider(BaseSpider): name = 'myspider' def __init__(self, domain='', *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.start_urls = [domain] # 

funcionará 🙂

Para pasar argumentos con el comando de rastreo

scp crawl myspider -a category = ‘mycategory’ -a domain = ‘example.com’

Para pasar argumentos para ejecutar en scrapyd, reemplace -a por -d

curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d category = ‘mycategory’ -d domain = ‘ejemplo.com’

La araña recibirá argumentos en su constructor.

 class MySpider(Spider): name="myspider" def __init__(self,category='',domain='', *args,**kwargs): super(MySpider, self).__init__(*args, **kwargs) self.category = category self.domain = domain 

Scrapy pone todos los argumentos como atributos de araña y puede omitir el método init por completo. Tenga cuidado con el método getattr para obtener esos atributos para que su código no se rompa.

 class MySpider(Spider): name="myspider" start_urls = ('https://httpbin.org/ip',) def parse(self,response): print getattr(self,'category','') print getattr(self,'domain','') 
    Intereting Posts