12

UPD:不是很接近的问题,因为我认为我的方式还不够清晰

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

在“普通”python中我做

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

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

更新

解决方案对我来说足够了,但我不确定结果的质量。如果你有很多超时错误的连接Download time可能是错误的(甚至是DOWNLOAD_TIMEOUT * 3)

为了

设置.py

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

中间件.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)

在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)
4

3 回答 3

7

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

这个下载器中间件听起来对许多项目都很有用。

于 2013-04-05T12:18:06.450 回答
5

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

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

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

于 2020-05-14T01:05:53.800 回答
0

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

@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

更详细的答案在这里

于 2020-06-08T15:41:12.733 回答