2013-04-05 23 views
9

UPD:接近していない質問は、私はScrapy要求+応答+ダウンロード時間

それが項目にそれを保存するために、現在の要求+応答+ダウンロード時間を取得することは可能ですがあるべきな私のやり方はそれほど明確ではないと思うので、 ? "プレーン" Pythonで

I行う

start_time = time() 
urllib2.urlopen('http://example.com').read() 
time() - start_time 

しかし、どのように私はScrapyでこれを行うことができますか?

UPD:私のためにenought

ソリューションが、私は結果の品質のよく分かりません。あなたはタイムアウトエラーと多くの接続を持っている場合はDownload time

クモ内部

settings.py

DOWNLOADER_MIDDLEWARES = { 
    'myscraper.middlewares.DownloadTimer': 0, 
} 

middlewares.py

from time import time 
from scrapy.http import Response 


class DownloadTimer(object): 
    def process_request(self, request, spider): 
     request.meta['__start_time'] = time() 
     # this not block middlewares which are has greater number then this 
     return None 

    def process_response(self, request, response, spider): 
     request.meta['__end_time'] = time() 
     return response # return response coz we should 

    def process_exception(self, request, exception, spider): 
     request.meta['__end_time'] = time() 
     return Response(
      url=request.url, 
      status=110, 
      request=request) 

のために(でもDOWNLOAD_TIMEOUT * 3)

間違っている可能性があります。 py in in def parse(...

log.msg('Download time: %.2f - %.2f = %.2f' % (
    response.meta['__end_time'], response.meta['__start_time'], 
    response.meta['__end_time'] - response.meta['__start_time'] 
), level=log.DEBUG) 

答えて

6

Downloader Middlewareと書くと、それぞれのリクエストに時間がかかります。リクエストが開始される前に開始時刻が追加され、完了すると終了時刻が追加されます。通常、このような任意のデータはRequest.meta属性に格納されます。このタイミング情報は、後であなたのクモが読むことができ、あなたのアイテムに追加することができます。

このダウンローダミドルウェアは、多くのプロジェクトで役に立ちそうですね。