python学习:python爬虫之Scrapy框架(5):Scrapy自定义命令

Scrapy框架

  这里主要介绍Scrapy自定义命令,部分源代码执行过程解析。

15 scrapy自定義命令

    在spider同級創建目录:commands,保存我们自定义的命令。

创建crawlall.py文件,实现一次启动所有spider。

创建对应类CrawlallCommand继承ScarpyCommand类,重写run方法

示例:

from scrapy.commands import ScrapyCommand

from scrapy.utils.project import  get_project_settings

 
class CrawlallCommand(ScrapyCommand):

        requires_project = True

        def syntax(self):

            return ['option']

        #命令描述

        def short_desc(self):

            return 'open all spider'

        #执行命令

        def run(self, args, opts):

            #获取当前spider的列表

            spider_list = self.crawler_process.spiders.list()

            for name in spider_list:

                #将spider加入启动序列

                self.crawler_process.crawl(name,**opts.__dict__)

            #执行序列,启动spider

            self.crawler_process.start()

 

在settings.py中注册我们编写的类的文件夹

示例:

#自定义命令

COMMANDS_MODULE = "Pro_scrapy.commands"

 

使用scrapy –help,可以查看我们的scrapy命令,可以看到我们创建文件名crawall作为命令可以已经注册进scrapy。

 

 

 

Scrapy源码流程:

    使用crawler_process对象可以获取到spider的列表,然后调用start方法可以启动spider。

    crawler_process是from scrapy.crawler import CrawlerProcess类的对象。

    1、执行CrawlerProcess的构造方法;

    示例源码:

def __init__(self, settings=None, install_root_handler=True):

    super(CrawlerProcess, self).__init__(settings)

    install_shutdown_handlers(self._signal_shutdown)

    configure_logging(self.settings, install_root_handler)

    log_scrapy_info(self.settings)

 

    2、执行CrawlerProcess父类构造方法,父类CrawlerRunner;

示例源码:

def __init__(self, settings=None):

    if isinstance(settings, dict) or settings is None:

        settings = Settings(settings)

    self.settings = settings

    self.spider_loader = _get_spider_loader(settings)

    self._crawlers = set()

    self._active = set()

    self.bootstrap_failed = False

 

@property

def spiders(self):

    warnings.warn("CrawlerRunner.spiders attribute is renamed to "

                  "CrawlerRunner.spider_loader.",

                  category=ScrapyDeprecationWarning, stacklevel=2)

    return self.spider_loader

 

    3、使用CrawlerProcess.spiders获取的就是spider_loader,spider_loader的值是_get_spider_loader(settings)方法返回值。获取到settings.py的SPIDER_MODULES遍历目录获取.py中爬虫name。

示例源码:

def _get_spider_loader(settings):

    """ Get SpiderLoader instance from settings """

    cls_path = settings.get('SPIDER_LOADER_CLASS')

    loader_cls = load_object(cls_path)

    try:

        verifyClass(ISpiderLoader, loader_cls)

    except DoesNotImplement:

        warnings.warn(

            'SPIDER_LOADER_CLASS (previously named SPIDER_MANAGER_CLASS) does '

            'not fully implement scrapy.interfaces.ISpiderLoader interface. '

            'Please add all missing methods to avoid unexpected runtime errors.',

            category=ScrapyDeprecationWarning, stacklevel=2

        )

    return loader_cls.from_settings(settings.frozencopy())

 

posted @ 2021-01-07 20:42  渔歌晚唱  阅读(240)  评论(0)    收藏  举报