【系列】scrapy启动流程源码分析(5)Scraper刮取器

本文详细分析了Scrapy的Scraper组件,包括Scraper对象、SpiderMiddlewareManager爬虫中间件管理器、ItemPipelineManager项目管道管理器和并发项目控制。讲解了Scraper如何通过中间件处理请求、响应和数据,以及其工作流程,重点阐述了Scrapy的item处理和并发控制机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.Scraper刮取器

对ExecutionEngine执行引擎篇出现的Scraper进行展开。Scraper的主要作用是对spider中间件进行管理,通过中间件完成请求、响应、数据分析等工作。

Scraper对象

scrapy/core/scraper.py#Scraper:

class Scraper(object):
    def __init__(self, crawler):
        self.slot = None
        self.spidermw = SpiderMiddlewareManager.from_crawler(crawler)
        itemproc_cls = load_object(crawler.settings['ITEM_PROCESSOR'])
        self.itemproc = itemproc_cls.from_crawler(crawler)
        self.concurrent_items = crawler.settings.getint('CONCURRENT_ITEMS')
        self.crawler = crawler
        self.signals = crawler.signals
        self.logformatter = crawler.logformatter

主要有3个对象:spidermw,itemproc,concurrent_items。

spidermw:SpiderMiddlewareManger爬虫中间件管理器

self.spidermw = SpiderMiddlewareManager.from_crawler(crawler),同样通过from_crawler方法生成爬虫中间件管理器。
这个from_cralwer方法是基类MiddlewareManger的方法:
scrapy/middleware.py#MiddlewareManager:

    @classmethod
    def from_crawler(cls, crawler):
        return cls.from_settings(crawler.settings, crawler)
        
    @classmethod
    def from_settings(cls, settings, crawler=None):
        mwlist = cls._get_mwlist_from_settings(settings)
        middlewares = []
        enabled = []
        for clspath in mwlist:
            try:
                mwcls = load_object(clspath)
                if crawler and hasattr(mwcls, 'from_crawler'):
                    mw = mwcls.from_crawler(crawler)
                elif hasattr(mwcls, 'from_settings'):
                    mw = mwcls.from_settings(settings)
                else:
                    mw = mwcls()
                middlewares.append(mw)
                enabled.append(clspath)
            except NotConfigured as e:
                if e.args:
                    clsname = clspath.split('.')[-1]
                    logger.warning("Disabled %(clsname)s: %(eargs)s",
                                   {
   'clsname': clsname, 'eargs': e.args[0]},
                                   extra={
   'crawler': crawler})

        logger.info("Enabled %(componentname)ss:\n%(enabledlist)s",
                    {
   'componentname': cls.component_name,
                     'enabledlist': pprint.pformat(enabled)},
                    extra={
   'crawler': crawler})
        return cls(*middlewares)

1.首先调用_get_mwlist_from_settings方法从配置文件中生成中间件列表。
2.然后依次加载中间件模块并构造对象,构造顺序是先尝试调用from_cralwer,再尝试调用from_settings,最后都没有再调用init(从这里可以看出中间件的加载逻辑,from_cralwer优先于init,中间件直接在配置文件中注册名称使用,不必继承基类)。
3.中间件除了类路径,还有一个优先级,这个决定了后面调用的先后顺序,数字越小调用越靠前。

默认中间件:
scrapy/settings/default_settings.py:

SPIDER_MIDDLEWARES_BASE = {
   
    # Engine side
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
    'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,
    'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
    'scrapy.spidermiddlewares.depth.DepthMiddleware'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值