python3中scrapy框架执行流程是怎样的
Scrapy框架执行流程
Scrapy是一个基于Python的高级网络爬虫框架,使用了Twisted异步网络库。Scrapy的执行流程可以分为以下几个步骤:
第一步:引擎(Engine)启动
Scrapy启动时,会初始化一个引擎对象,该对象负责调度整个爬虫的运行流程。引擎会先读取用户定义的爬虫启动URL,并生成初始的请求(Request),并将该请求传递给调度器(Scheduler)。
def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, self.parse)
第二步:调度器(Scheduler)管理请求队列
调度器负责管理所有的请求(Request)。当一个请求(Request)被传递给调度器,它会先进行去重,然后判断该请求的优先级,将其放入请求队列中。调度器选取下一个待爬取的请求(Request)后,会将其传递给下载器(Downloader),并等待下载器返回响应(Response)。
def __init__(self, spidermw=None, close_if_idle=True, log=None): self.spidermw = spidermw or SpiderMiddlewareManager.from_crawler self.downloaders = set() self.close_if_idle = close_if_idle self.log = log def enqueue_request(self, request): if not request.dont_filter and self.df.request_seen(request): self.df.log(request, self.spider) return False if self.stats: self.stats.inc_value('scheduler/enqueued/{}'.format(request.spider.name), spider=request.spider) dqok = self._dqpush(request) if dqok: self.has_pending_requests = True return dqok
第三步:下载器(Downloader)获取响应
下载器负责将待下载的请求(Request)发送给网站服务器,并等待响应(Response)。下载器支持异步处理,可以同时处理多个请求。下载器在收到响应(Response)后,将响应传递给爬虫中间件(SpiderMiddleware)进行处理。
def download_request(self, request, spider): def _on_success(response): self.stat_inc('response_received_count', spider=spider) d.callback(response) def _on_error(failure): self.stat_inc('response_received_count', spider=spider) d.errback(failure) dwld = self._get_downloader(request) dfd = dwld.fetch(request, spider) dfd.addCallbacks(_on_success, _on_error) return d
第四步:爬虫(Spider)处理响应数据
当爬虫中间件(SpiderMiddleware)处理完响应(Response)后,会将该响应传递给爬虫(Spider)进行数据解析和提取。爬虫(Spider)会根据用户定义的解析规则,对响应(Response)中的HTML文档进行解析和提取。当爬虫解析完响应数据后,将解析结果交给Item Pipeline进行后续处理。
def parse(self, response): self.logger.info('Parse function called on %s', response.url) for quote in response.css('div.quote'): item = { 'text': quote.css('span.text::text').get(), 'author': quote.css('span small::text').get(), 'tags': quote.css('div.tags a.tag::text').getall(), } yield item
总结
Scrapy框架执行流程可以分为引擎(Engine)启动、调度器(Scheduler)管理请求队列、下载器(Downloader)获取响应、爬虫(Spider)处理响应数据四个步骤。在整个流程中,引擎负责整个框架的调度与协调,调度器主要负责管理请求队列,并通过去重和优先级控制保证针对同一网站的请求并发度不会太高,下载器主要负责将待下载的请求发送给网站服务器,并等待响应返回。爬虫主要负责处理响应数据,根据用户定义的解析规则,对响应(Response)中的HTML文档进行解析和提取,并将解析结果交给Item Pipeline进行后续处理。