2016-04-08 19 views
1

也許我缺少一些簡單的東西,所以我希望這是一個簡單的問題。我使用Scrapy解析目錄列表,然後拉下每個合適的網頁(實際上是一個文本文件)並使用Python解析出來。從一個履帶式的請求列表中的數據集合

每個頁面都有一組我感興趣的數據,每當我在每個頁面中遇到這樣的項目時,我都會更新全局字典。

我會要做的只是在所有請求調用完成後打印彙總摘要,但在yield命令沒有運行後。我假設,因爲yield實際上是返回一個發電機和救助。

我想避免每個Request對象都寫一個文件,如果可能的話......我寧願將它自包含在這個Python腳本中。

這裏是我使用的代碼:

from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
from scrapy.http import Request 

slain = {} 

class GameSpider(BaseSpider): 
    name = "game" 
    allowed_domains = ["example.org"] 
    start_urls = [ 
    "http://example.org/users/deaths/" 
    ] 

    def parse(self, response): 
    links = response.xpath('//a/@href').extract() 
    for link in links: 
     if 'txt' in link: 
     l = self.start_urls[0] + link 
     yield Request(l, callback=self.parse_following, dont_filter=True) 

# Ideally print out the aggregate after all Requests are satisfied  
# print "-----" 
# for k,v in slain.iteritems(): 
#  print "Slain by %s: %d" % (k,v) 
# print "-----" 

    def parse_following(self, response): 
    parsed_resp = response.body.rstrip().split('\n') 
    for line in parsed_resp: 
     if "Slain" in line: 
     broken = line.split() 
     slain_by = broken[3] 

     if (slain_by in slain): 
      slain[slain_by] += 1 
     else: 
      slain[slain_by] = 1 

回答

1

您已經關閉了(原因)功能,它被稱爲當蜘蛛完成。

def closed(self, reason): 
    for k,v in self.slain.iteritems(): 
     print "Slain by %s: %d" % (k,v) 
+0

謝謝!我正在尋找一個回調函數,但由於某種原因找不到這一個。 – espais