从源码开始学习Scrapy系列06-fetch指令

前言

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))

否则全部可以包含,需要转发的请求有请求包自动完成:

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()

到这里就结束了,最后俩步骤是调度的核心,我们也不做细讲,后面会具体谈到。

猜你喜欢

转载自blog.csdn.net/wang1472jian1110/article/details/80361292