使用 Scrapy 按固定时间间隔传出和传入带宽

Outgoing and Incoming Bandwidth at regular interval of time using Scrapy

是否可以定期使用 scrapy 获取抓取过程中使用的传出和传入带宽等统计信息?

是的,这是可能的。 =)

总请求和响应字节数已由跟踪时间并添加新统计信息的 DownloaderStats middleware that comes with Scrapy. You can add another downloader middleware 在统计信息中跟踪。

步骤如下:

1) 在 settings.py 中配置新的下载器中间件,并使用高序号以便稍后在管道中执行:

DOWNLOADER_MIDDLEWARES = {
    'testing.middlewares.InOutBandwithStats': 990,
}

2) 将以下代码放入与 settings.py

相同目录下的 middleware.py 文件中
import time


class InOutBandwithStats(object):

    def __init__(self, stats):
        self.stats = stats
        self.startedtime = time.time()

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.stats)

    def elapsed_seconds(self):
        return time.time() - self.startedtime

    def process_request(self, request, spider):
        request_bytes = self.stats.get_value('downloader/request_bytes')

        if request_bytes:
            outgoing_bytes_per_second = request_bytes / self.elapsed_seconds()
            self.stats.set_value('downloader/outgoing_bytes_per_second',
                                 outgoing_bytes_per_second)

    def process_response(self, request, response, spider):
        response_bytes = self.stats.get_value('downloader/response_bytes')

        if response_bytes:
            incoming_bytes_per_second = response_bytes / self.elapsed_seconds()
            self.stats.set_value('downloader/incoming_bytes_per_second',
                                 incoming_bytes_per_second)

        return response

就是这样。 process_request/process_response 方法将在处理 request/response 时调用,并将相应地不断更新统计数据。

如果你想定期获得日志,你也可以在那里调用 spider.log('Incoming bytes/sec: %s' % incoming_bytes_per_second)

阅读更多