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())
本文来自博客园,作者:渔歌晚唱,转载请注明原文链接:https://www.cnblogs.com/tangToms/articles/14248647.html

浙公网安备 33010602011771号