2013-03-25 76 views

回答

111

使用-a选项在抓取命令中传递了蜘蛛参数。例如:

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

蜘蛛可以在自己的初始化访问参数:

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 

从Scrapy文档摘自:http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

更新2013:添加第二个参数

更新2015:调整措辞

更新2016:使用新的基类,并添加超,感谢@Birla

更新2017年:使用Python3超级

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

嘿谢谢你的答案。 但可以说,我想传递两个参数,我会使用类似: scrapy爬行myspider -a类别=电子域=系统 或 scrapy爬行myspider -a类别=电子-a域=系统 – 2013-03-26 18:32:53

+3

scrapy抓取myspider -a category = electronics -a domain = system – 2013-03-26 18:55:03

+0

上面的代码对我来说只是部分工作。例如。如果我使用'self.domain'定义域,我仍然无法在'__init__'方法之外访问它。 Python抛出一个未定义的错误。顺便说一句,为什么你省略了“超级”呼叫? PS。我正在使用CrawlSpider类 – Birla 2014-09-24 10:57:53

3

要传递的参数与命令爬

scrapy抓取myspider -a category ='mycategory'-a domain ='example.com'

为了将参数传递给上scrapyd运行更换-a-d

卷曲http://your.ip.address.here:port/schedule.json -d 蜘蛛= myspider -d类别= 'mycategory' -d域='的例子。 com'

蜘蛛将在其构造函数中接收参数。


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

使用-a选项运行爬网命令时会传递spider参数。例如,如果我想要一个域名作为参数传递给我的蜘蛛,然后我会做这个 -

scrapy爬行myspider -a域=“http://www.example.com”

并在蜘蛛的构造函数中接收参数:

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

...

,将工作:)

6

以前的答案是正确的,但你不必声明构造(__init__)你想编写一个scrapy的蜘蛛每一次,你可以只指定参数之前:

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

,并在你的蜘蛛的代码,你可以只用它们作为蜘蛛参数:

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 

,它就可以工作。