2016-12-13 36 views
1

這是蜘蛛呼叫從管道蜘蛛的方法 - Python的Scrapy

class TicketsSpider(scrapy.Spider): 

    def __set_last_start_date(self, dateString): 
     #code here 

這是管道

class TicketsPipeline(object): 

    def spider_closed(self, spider): 
     spider.__set_last_start_date(spider.lastAdScrapedDate) 

    @classmethod 
    def from_crawler(cls, crawler): 
     pipeline = cls() 
     crawler.signals.connect(pipeline.spider_closed, signals.spider_closed) 
     return pipeline 

我想從spider_closed()方法調用__set_last_start_date()功能。但我收到此錯誤

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 149, in maybeDeferred 
    result = f(*args, **kw) 
    File "build/bdist.linux-x86_64/egg/pydispatch/robustapply.py", line 55, in robustApply 
    File "tickets/pipelines.py", line 236, in spider_closed 
    spider.__set_last_start_date(spider.lastAdScrapedDate) 
AttributeError: 'TicketsSpider' object has no attribute '_TicketsPipeline__set_last_start_date' 
2016-12-13 02:49:53 [scrapy] INFO: Dumping Scrapy stats: 

我可以向你保證,我可以得到spider.lastAdScrapedDate但我無法調用spider.__set_last_start_date

+0

你可以調用任何其它蜘蛛的方法?是否正確定義了__set_last_start_date?也許你需要用調試器進行調查 –

+0

我可以得到'spider.lastAdScrapedDate',但我無法調用'spider .__ set_last_start_date' – Umair

+0

我在說的是方法,而不是屬性。爲什麼錯誤提到'_TicketsPipeline__set_last_start_date'而不是'TicketsSpider'對象沒有屬性'__set_last_start_date''?嘗試使用pdb –

回答

3

名稱,在一個類中,有雙下劃線領先旨在爲私有。

形式__spam的任何標識符(至少兩個前導下劃線,至多一個結尾下劃線)的文本上與_classname__spam,classname即當前的類名剝離前導下劃線(一個或多個)所取代。

詳情請參見this

選項1.您可以重命名您的方法名稱,不要使用雙下劃線開頭。

選項2,如果你要保持你的方法名,然後調用它以這種方式,但我不認爲這是一個好主意:

def close_spider(self, spider): 
     spider._TicketsSpider__set_last_start_date(spider.lastAdScrapedDate) 
+0

謝謝@pennyliangliping,我不知道雙下劃線是這麼做的。 –

+0

@pennyliangliping從來沒有想到:P – Umair