c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

python3中scrapy框架执行流程是怎样的

方兆玉 2023-09-12编程经验
Scrapy框架执行流程Scrapy是一个基于Python的高级网络爬虫框架,使用了Twisted异步网络库。Scrapy的执行流程可以分为以下几个步骤:第一步:引擎(E

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进行后续处理。

文章评论