zg手册 之 scrapy 开发(6)-- extensions(扩展)开发

牧云@^-^@ 提交于 2019-11-30 04:18:13

scrapy 扩展

扩展提供了一种机制,添加自定义的功能到 scrapy

例如,爬虫状态统计扩展,统计爬虫的运行信息


加载和运行

在 scrapy 启动时创建扩展的单一实例对象,添加扩展的配置到 settings.py 文件

# 下面的字典定义了加载的扩展,字符串是扩展的路径名,数字是加载插件的顺序
EXTENSIONS = {
    'scrapy.contrib.corestats.CoreStats': 500,
    'scrapy.webservice.WebService': 500,
    'scrapy.telnet.TelnetConsole': 500,}
# 启用插件
MYEXT_ENABLED = True


一个官方的插件例子

  1. from_crawler 是创建插件(下载插件,扩展插件等)实例时,被框架调用的方法。可以检查配置,传递配置信息(可以从 crawler.settings 对象获取 settings.py 中定义的配置信息)

  2. 调用 crawler.signals.connect 注册事件回调函数,在事件发生时被框架回调

from scrapy import signals
from scrapy.exceptions import NotConfigured

class SpiderOpenCloseLogging(object):

    def __init__(self, item_count):
        self.item_count = item_count
        self.items_scraped = 0

    @classmethod
    def from_crawler(cls, crawler):
        # 检查插件是否启用,如果没设置插件,抛出异常 NotConfigured
        if not crawler.settings.getbool('MYEXT_ENABLED'):
            raise NotConfigured

        # 从配置文件 settings.py 获取配置
        item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 1000)

        # 创建插件对象实例
        ext = cls(item_count)

        # 监听 spider 打开事件
        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)

        # 监听 spider 关闭事件
        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)

        # 监听 item 获取事件(获取抓取的结果)
        crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

        # 返回扩展对象
        return ext

    def spider_opened(self, spider):
        spider.log("opened spider %s" % spider.name)

    def spider_closed(self, spider):
        spider.log("closed spider %s" % spider.name)

    def item_scraped(self, item, spider):
        self.items_scraped += 1
        if self.items_scraped == self.item_count:
            spider.log("scraped %d items, resetting counter" % self.items_scraped)
            self.item_count = 0


原文链接: http://www.hopez.org/blog/9/1396850810

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!