2016-04-08 14 views
1

多分私は何かが簡単でないので、私は希望これは簡単な質問です。私はScrapyを使ってディレクトリリストを解析し、適切なWebページ(実際にはテキストファイル)をプルダウンし、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