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