使用 Python Scrapy 获取爬虫详细信息

使用 Python 的 Scrapy 框架获取爬虫详细信息是一个常见的任务。Scrapy 是一个功能强大的爬虫框架,适用于从网站提取数据。以下是一个简单的示例,展示如何使用 Scrapy 创建一个爬虫并获取爬取的数据。

在这里插入图片描述

1、问题背景

在使用 Python Scrapy 从网站提取数据时,您可能需要维护一个信息面板来跟踪爬虫的运行情况。Scrapy 中如何获取以下信息?

  • 爬虫运行时间
  • 爬虫启动和停止时间
  • 爬虫状态(活跃或已停止)
  • 同时运行的爬虫列表

2、解决方案

使用 Scrapy 扩展自定义功能,获取爬虫详细信息,具体解决方案如下:

第一步:创建扩展

创建一个名为 SpiderDetails 的扩展类,该类用于收集爬虫相关信息,如启动/停止时间。

from datetime import datetime
from scrapy import signals
from twisted.internet.task import LoopingCall

class SpiderDetails(object):
    """Extension for collect spider information like start/stop time."""

    update_interval = 5  # in seconds

    def __init__(self, crawler):
        # keep a reference to the crawler in case is needed to access to more information
        self.crawler = crawler
        # keep track of polling calls per spider
        self.pollers = {}

    @classmethod
    def from_crawler(cls, crawler):
        instance = cls(crawler)
        crawler.signals.connect(instance.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(instance.spider_closed, signal=signals.spider_closed)
        return instance

    def spider_opened(self, spider):
        now = datetime.utcnow()
        # store curent timestamp in db as 'start time' for this spider
        # TODO: complete db calls

        # start activity poller
        poller = self.pollers[spider.name] = LoopingCall(self.spider_update, spider)
        poller.start(self.update_interval)

    def spider_closed(self, spider, reason):
        # store curent timestamp in db as 'end time' for this spider
        # TODO: complete db calls

        # remove and stop activity poller
        poller = self.pollers.pop(spider.name)
        poller.stop()

    def spider_update(self, spider):
        now = datetime.utcnow()
        # update 'last update time' for this spider
        # TODO: complete db calls
        pass

第二步:计算运行时间和状态

在 spider_closed 方法中,计算爬虫的运行时间,并根据最后更新时间判断爬虫状态(活跃或停止)。

import datetime

def spider_closed(self, spider, reason):
    # store curent timestamp in db as 'end time' for this spider
    # TODO: complete db calls

    # remove and stop activity poller
    poller = self.pollers.pop(spider.name)
    poller.stop()

    # calculate running time
    running_time = datetime.utcnow() - self.start_time

    # update spider status
    if running_time < datetime.timedelta(seconds=self.update_interval * 2):
        spider_status = 'active'
    else:
        spider_status = 'stopped'

第三步:获取正在运行的爬虫列表

您可以通过查询数据库中没有结束时间的爬虫记录来获取正在运行的爬虫列表。

def get_running_spiders():
    # query database for spider records with empty end time
    running_spiders = []
    for spider_record in spider_records:
        if not spider_record.end_time:
            running_spiders.append(spider_record)
    return running_spiders

第四步:在 settings.py 中添加扩展

将 SpiderDetails 扩展添加到 Scrapy 的 settings.py 文件中,以便在爬虫启动时加载。

EXTENSIONS = {
    # SpiderDetails class is in the file mybot/extensions.py
    'mybot.extensions.SpiderDetails': 1000,
}

通过这些步骤,您就可以在 Scrapy 中获取爬虫的详细信息,包括运行时间、启动和停止时间、状态以及同时运行的爬虫列表。

通过这些步骤,我们可以创建一个功能强大的 Scrapy 爬虫,并配置其详细信息以适应不同的爬取需求。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值