example crawl web-crawler scrapy

web crawler - crawl - Cómo pasar un argumento definido por el usuario en scrapy spider



scrapy rules example (4)

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

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


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'','''')