Scrapy 自定义扩展

Scrapy 自定义扩展

介绍

Scrapy 允许我们使用扩展将自定义功能添加到 Scrapy 机制中。Scrapy 提供了丰富的自定义扩展功能,让开发者可以根据自己的需求来扩展其功能。以下是一些常见的自定义扩展功能:

  1. 中间件扩展:Scrapy 的中间件允许用户在请求被发送到下载器之前或之后对请求和响应进行处理。开发者可以通过编写自定义的中间件来实现一些特定的处理逻辑,比如修改请求头、代理设置、重试逻辑等。

  2. 管道扩展:Scrapy 的管道用于处理爬取到的数据,在数据存储之前进行处理。用户可以编写自定义的管道来实现数据的处理和存储逻辑,比如数据清洗、去重、存储到数据库等。

  3. 下载器中间件扩展:下载器中间件与普通中间件类似,不同之处在于下载器中间件只在请求被下载器处理时生效。用户可以编写自定义的下载器中间件来实现一些下载相关的特定处理逻辑,比如设置下载延迟、处理异常等。

  4. 扩展命令:用户可以编写自定义的命令来扩展 Scrapy 的命令行工具。通过这种方式,用户可以实现一些自定义的管理功能,比如导出数据、生成报告等。

总的来说,Scrapy 的自定义扩展功能使得开发者可以根据自己的需求来定制爬虫的功能,实现更加灵活和定制化的爬虫功能。

加载与关闭扩展类

扩展只是在在 Scrapy 启动时初始化的一些常规类。

你应该使用 Scrapy 设置项来管理扩展。

开启或关闭扩展,可以通过 setting.pyEXTENSIONS 选项来控制。该选项会与 scrapy 默认的 EXTENSIONS_BASE 进行合并。

如果扩展依赖于其它扩展,可以通过定义其值,指定加载顺序。

如果某个扩展的值被设置为 None,代表关闭该扩展。也可以在 settings.py 中将其注释掉或者删除对应的配置。

EXTENSIONS = {
    'scrapy.extensions.corestats.CoreStats': 500,
    'scrapy.extensions.telnet.TelnetConsole': 500,
    # 配置加载扩展类
    'myproject.extensions.MyExtension': 500,
}

其中,'myproject.extensions.MyExtension' 是自定义扩展类的路径,500 是加载顺序(数字越小越先加载)。

注意,一些自带的扩展的开启与否并非仅仅依赖于是否扩展类是否加载,例如 HTTP Cache 扩展默认是加载的,但它的功能又依赖于 HTTPCACHE_ENABLED 设置项来控制。

在 Scrapy 中加载和关闭自定义扩展类可以通过在 settings.py 中配置相应的设置来实现。以下是加载和关闭扩展类的方法:

自定义扩展类

扩展就是一个普通的 Python 类。

示例

import logging
from scrapy import signals
from scrapy.exceptions import NotConfigured

logger = logging.getLogger(__name__)

class SpiderOpenCloseLogging(object):

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

    @classmethod
    def from_crawler(cls, crawler):
        # first check if the extension should be enabled and raise
        # NotConfigured otherwise
        if not crawler.settings.getbool('MYEXT_ENABLED'):
            raise NotConfigured

        # get the number of items from settings
        item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 1000)

        # instantiate the extension object
        ext = cls(item_count)

        # connect the extension object to signals
        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)
        crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped)

        # return the extension object
        return ext

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

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

    def item_scraped(self, item, spider):
        self.items_scraped += 1
        if self.items_scraped % self.item_count == 0:
            logger.info("scraped %d items", self.items_scraped)
内容概要:本文由《未来产业新赛道研究报告》整理而成,涵盖了未来产业在全球范围内的发展态势和竞争形势。报告指出,引领型国家通过全方位体制机制创新,在先进制造、人工智能、量子科技、新一代通信等领域建立了全面领先优势。文中引用了麦肯锡和GVR的数据,预测了人工智能和人形机器人等未来产业的巨大经济潜力。报告还详细介绍了国外和国内对未来产业赛道的重点布局,如量子科技、人工智能、先进网络和通信技术、氢能与储能、生物技术等。此外,报告列举了中国重点省市如北京、上海等的具体发展方向,以及知名研究机构对未来产业热点的分析。最后,报告提出了构建我国未来产业重点赛道目录的建议,包括通用人工智能、高级别自动驾驶、商业航天、人形机器人、新型储能、低空经济、清洁氢、算力芯片、细胞与基因治疗和元宇宙等十大重点赛道。 适用人群:对科技趋势和未来产业发展感兴趣的政策制定者、投资者、企业家和研究人员。 使用场景及目标:①帮助政策制定者了解全球未来产业发展动态,为政策制定提供参考;②为企业提供未来产业布局的方向和重点领域;③为投资者提供投资决策依据,识别未来的投资机会;④为研究人员提供未来科技发展趋势的全景图。 其他说明:报告强调了未来产业在全球经济中的重要性,指出了中国在未来产业布局中的战略定位和发展路径。同时,报告呼吁加强国家顶层设计和行业系统谋划,探索建立未来产业技术预见机制,深化央地联动,推动未来产业高质量发展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值