2016-02-26 27 views
0

我使用https://github.com/rolando/scrapy-redis來創建一個讀取來自Redis列表的URL的蜘蛛。我遇到的問題是我想在每個網址一側發送一個唯一的ID。這樣我可以再次識別db中的條目。Scrapy將變量和URL一起發送給蜘蛛

我在Redis的名單看起來是這樣的:每默認 http://google.com[someuniqueid] http://example.com[anotheruniqueid]

Scrapy,Redis的來自然後被髮送到蜘蛛的Redis只讀取的URL。

我修改裏面:https://github.com/rolando/scrapy-redis/blob/master/scrapy_redis/spiders.py

而且改變了這一功能:通過調用

def next_request(self): 
    """Returns a request to be scheduled or none.""" 
    url = self.server.lpop(self.redis_key) 
    if url: 
     mm = url.split("[") 
     self.guid = mm[1].replace("]", "") 
     return self.make_requests_from_url(mm[0]) 

這工作,我可以獲取所需的GUID我的蜘蛛內部:

print self.guid 

的問題不過是它似乎混淆了guid的。我並不總是每個url都有正確的guid。

我應該怎樣把這個guid寄給我的蜘蛛?

+0

也許你定義(外GUID作爲一個共享變量的init,在它之上)。由於異步和只有一種方法來保持價值。只是猜測 – PascalVKooten

+0

我應該把它放在哪裏? :) – mjhd

回答

1

這是因爲scrapy是異步的,並且您將異步數據存儲在對象變量中,因此您不能依賴它。有幾種方法可以解決這個問題。最常見的是:

使用scrapy.Request with meta={'guid': guid}的說法。
替換此行:

return self.make_requests_from_url(mm[0]) 

有:

return scrapy.Request(mm[0], meta={'guid': mm[1].replace("]", "")} 

,現在在你的parse()您可以訪問的GUID用:

def parse(self, response): 
    guid = response.meta['guid']