前言
fetch指令是通过scrapy下载器对给定的一个url进行抓取,并将抓取结果进行输出
代码调试
进入fetch模块的run方法
参数校验,如果参数不是1个或者不是标准的url格式,则抛出用法错误:
if len(args) != 1 or not is_url(args[0]): raise UsageError()
def is_url(text): return text.partition("://")[0] in ('file', 'http', 'https')
定义输出回调函数:
cb = lambda x: self._print_response(x, opts)
初始化request对象:
request = Request(args[0], callback=cb, dont_filter=True)
如果选项中没有no-redirect选项,即不进行转发,则可处理的状态列表中包含除了300到400的所有状态码:
if not opts.no_redirect: request.meta['handle_httpstatus_list'] = SequenceExclude(range(300, 400))
否则全部可以包含,需要转发的请求有请求包自动完成:
扫描二维码关注公众号,回复:
937796 查看本文章
request.meta['handle_httpstatus_all'] = True
初始化赋值为自带简易爬虫:
spidercls = DefaultSpider
初始化爬虫加载器:
spider_loader = self.crawler_process.spider_loader
如果给定了爬虫选项,则根据给定的爬虫进行爬取,否则根据request url来查找匹配爬虫:
if opts.spider: spidercls = spider_loader.load(opts.spider) else: spidercls = spidercls_for_request(spider_loader, request, spidercls)
使用上述判定的爬虫对给定的url进行抓取,只需要传递start_requests即可:
self.crawler_process.crawl(spidercls, start_requests=lambda: [request])
爬虫开启:
self.crawler_process.start()
到这里就结束了,最后俩步骤是调度的核心,我们也不做细讲,后面会具体谈到。