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

2024-08-12 10:07:01 浏览数 (3)

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

1、问题背景

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

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

2、解决方案

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

第一步:创建扩展

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

代码语言:javascript复制
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 方法中,计算爬虫的运行时间,并根据最后更新时间判断爬虫状态(活跃或停止)。

代码语言:javascript复制
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'

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

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

代码语言:javascript复制
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 文件中,以便在爬虫启动时加载。

代码语言:javascript复制
EXTENSIONS = {
    # SpiderDetails class is in the file mybot/extensions.py
    'mybot.extensions.SpiderDetails': 1000,
}

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

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

0 人点赞