使用Scrapy以规则的时间间隔进行传出和传入带宽

时间:2015-02-25 11:21:31

标签: scrapy

是否有可能在定期的时间间隔内使用scrapy获取在抓取期间使用的传出和传入带宽等统计信息?

1 个答案:

答案 0 :(得分:1)

是的,有可能。 =)

DownloaderStats middleware that comes with Scrapy已在统计信息中跟踪了总请求和响应字节数。您可以添加跟踪时间的其他downloader middleware并添加新统计信息。

以下是它的步骤:

1)在settings.py中配置一个具有高订单号的新下载中间件,以便稍后在管道中执行:

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

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

相同的目录中的settings.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方法,并会相应地更新统计信息。

如果您想定期登录日志,也可以在那里拨打spider.log('Incoming bytes/sec: %s' % incoming_bytes_per_second)

了解更多