Scrapy请求+响应+下载时间

时间:2013-04-05 10:48:16

标签: scrapy

UPD :不接近问题,因为我认为我的方式不是那么清楚

是否可以获取当前请求+响应+下载时间以将其保存到项目?

在“普通”python中我做了

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

但是我怎么能用Scrapy做到这一点?

UPD

解决方案适合我,但我不确定结果的质量。如果您有多个与超时错误的连接Download time可能是错误的(甚至DOWNLOAD_TIMEOUT * 3)

对于

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)

def parse(...

中的spider.py内
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)

3 个答案:

答案 0 :(得分:6)

你可以写一个Downloader Middleware来为每个请求计时。它会在请求生成之前为请求添加开始时间,然后在完成之后添加完成时间。通常,诸如此类的任意数据存储在Request.meta属性中。以后可以通过蜘蛛读取此计时信息并将其添加到您的项目中。

这个下载中间件听起来好像很适合很多项目。

答案 1 :(得分:2)

不确定在这里是否需要中间件。 Scrapy有一个request.meta,您可以查询它并屈服。对于下载延迟,只需屈服

download_latency=response.meta.get('download_latency'),

获取请求所花费的时间,因为请求具有 已启动,即通过网络发送的HTTP消息。此中继键 仅在下载响应后才可用。而 其他大多数元键用于控制Scrapy行为,这是 应该是只读的。

答案 2 :(得分:0)

我认为最好的解决方案是使用刮擦信号。每当请求到达下载器时,它都会发出 request_reached_downloader 信号。下载后,它发出 response_downloaded 信号。您可以从蜘蛛捕获它,然后从那里分配时间及其差异到meta。

@classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super(SignalSpider, cls).from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.item_scraped, signal=signals.item_scraped)
        return spider

有关here的详细说明