2013-03-25 35 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 

,它就可以工作。