Scrapy请求+响应+下载时间

b1_*_*b1_ 10 scrapy

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

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

在"普通"python我做

start_time = time()
urllib2.urlopen('http://example.com').read()
time() - start_time
Run Code Online (Sandbox Code Playgroud)

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

UPD:

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

对于

settings.py

DOWNLOADER_MIDDLEWARES = {
    'myscraper.middlewares.DownloadTimer': 0,
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

在spider.py中 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)
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 7

不确定您是否需要中间件。Scrapy 有一个 request.meta ,您可以查询并生成它。对于下载延迟,只需产量

download_latency=response.meta.get('download_latency'),
Run Code Online (Sandbox Code Playgroud)

自请求启动以来获取响应(即通过网络发送的 HTTP 消息)所花费的时间。仅当下载响应后,此元密钥才可用。虽然大多数其他元键用于控制 Scrapy 行为,但这个元键应该是只读的。


Sha*_*ans 6

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

这个下载中间件听起来像在许多项目中都很有用.

  • 但考虑到请求被调度为异步,下载者中间件可能会在实际启动之前几秒钟处理这些请求.除非我遗漏了某些东西,否则使用下载器中间件的这种方法并不真正起作用. (2认同)