2013-04-05 1 views
9

UPD: Non è vicino domanda, perché penso che la mia strada non è così chiara come dovrebbe essererichiesta Scrapy + risposta + tempo di download

E 'possibile ottenere richiesta corrente + risposta + scaricare il tempo per salvarlo alla voce ?

in Python "plain" Faccio

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

Ma come posso fare questo con Scrapy?

UPD:

soluzione abbastanza per me, ma non sono sicuro della qualità dei risultati. Se si dispone di molte connessioni con errori di timeout Download time può essere sbagliato (anche DOWNLOAD_TIMEOUT * 3)

Per

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) 

dentro ragno. py 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) 

risposta

6

Si potrebbe scrivere un Downloader Middleware che richiederebbe ogni volta. Aggiungerebbe un tempo di inizio alla richiesta prima che sia fatta e quindi un tempo di fine quando è finito. In genere, dati arbitrari come questo sono memorizzati nell'attributo Request.meta. Queste informazioni sul tempo potrebbero essere successivamente lette dal tuo spider e aggiunte al tuo oggetto.

Questo middleware per il download sembra essere utile per molti progetti.