2014-10-03 36 views
4

我在Scrapy中有一個Scrapy設置,它以數字序列中的1M個唯一URL爲目標。例如:http://www.foo.com/PIN=000000000001Scrapy spider_idle調用重新啓動刮擦

我把PIN碼保存在數據庫中。我不是將1M PIN碼加載到內存中並創建1M個start_urls,而是使用start_requests()函數一次向數據庫查詢5000個PIN。完成5000個唯一的URL後,我想重新開始抓取,並繼續進行,直到抓取所有1M網址。在scrapy用戶組中,他們建議我使用spider_idle函數來繼續重新開始刮擦。我已經按照下面的代碼正確設置了它,但我似乎無法找到正確的代碼來重新啓動刮擦。見下:

class Foo(Spider): 
    name = 'foo' 
    allowed_domains = ['foo.com'] 

    def __init__(self, *args, **kwargs): 
     super(Foo, self).__init__(*args, **kwargs) 
     dispatcher.connect(self.spider_idle, signals.spider_idle) 

    def spider_idle(self, spider): 
     print 'idle function called' # this prints correctly so I know this function is getting called. 
     self.start_requests() #this code does not restart the query 

    def start_requests(self): 
     data = self.coll.find({'status': 'unscraped'}).limit(5000) 

     for row in data: 
      pin = row['pin'] 
      url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin) 
      yield Request(url, meta={'pin': pin}) 

我需要什麼代碼重新啓動刮擦?

+0

你的'start_requests()'方法是怎麼樣的?謝謝。 – alecxe 2014-10-03 13:02:26

+0

我剛剛修改了代碼以包含start_requests()方法。 – dfriestedt 2014-10-03 13:27:25

回答

2

不要重新啓動的蜘蛛,我會在數據庫中查詢unscraped項目,直到有一無所有:

class Foo(Spider): 
    name = 'foo' 
    allowed_domains = ['foo.com'] 

    def start_requests(self): 
     while True: 
      data = self.coll.find({'status': 'unscraped'}).limit(5000) 

      if not data: 
       break 

      for row in data: 
       pin = row['pin'] 
       url = 'http://foo.com/Pages/PIN-Results.aspx?PIN={}'.format(pin) 
       yield Request(url, meta={'pin': pin}) 

你可能會需要實現超過與限制和偏移集合一個真正的分頁。

+0

我試圖避免將1M URL放入start_requests以保持內存使用量不變。你的解決方案肯定會工作,但我真的想一次運行5000,並不斷重新開始刮擦,直到在數據庫中所有1M行被標記爲'刮'爲止。 – dfriestedt 2014-10-03 13:46:11

+0

@dfriestedt當然,這是我想在這裏說的。在未修復的項目上分頁:get 5000,爲每行產生一個請求,再獲得5000個請求,爲每一行產生一個請求等等。這會減少內存使用量。 – alecxe 2014-10-03 13:49:06

+0

@dfriestedt我想你需要使用'skip()',參見[這個例子](http://docs.mongodb.org/manual/reference/method/cursor.skip/)。 – alecxe 2014-10-03 13:51:03