(四)Scrapy的抓取流程 Engine

2021-09-17 21:24:11 字數 2402 閱讀 9301

engine.py所在的目錄,抓取流程中的主要模組。

executionengine的__init__方法,初始化抓取流程中用到的各個控制項。

還是從上一章裡的open_spider和start兩個方法來看流程。

(1)open_spider

首先會根據spider物件裡的start_urls獲取到初始鏈結,然後由scheduler來對初始鏈結進行排程,在這一步之前,仍會經過spider中介軟體的process_start_requests方法(記得有些教程說的是直接從spider這兒取鏈結到scheduler,沒有提到spider中介軟體)。

這個slot物件可以看做是請求的狀態,來管理engine的執行狀態和正在請求的request的管理。而所謂的scheduler對request的操作,則都是通過slot來完成的。

@defer.inlinecallbacks

def open_spider(self, spider, start_requests=(), close_if_idle=true):

assert self.has_capacity(), "no free spider slot when opening %r" % \

spider.name

logger.info("spider opened", extra=)

nextcall = calllateronce(self._next_request, spider)

scheduler = self.scheduler_cls.from_crawler(self.crawler)

start_requests = yield self.scraper.spidermw.process_start_requests(start_requests, spider)

slot = slot(start_requests, close_if_idle, nextcall, scheduler) # 使用scheduler初始化slot

self.slot = slot

self.spider = spider

yield scheduler.open(spider) # 對scheduler的初始化(spider,佇列, 過濾器)

yield self.scraper.open_spider(spider) # 初始化scraper中的spider,後續分配任務用

self.crawler.stats.open_spider(spider) # 狀態收集器,字典方式儲存資料。預設是memorystatscollector

yield self.signals.send_catch_log_deferred(signals.spider_opened, spider=spider)

slot.nextcall.schedule() # 請求入隊操作

slot.heartbeat.start(5) # 下次請求的時間,又因為預設是即時觸發方法,所以並不會等待5秒。

在這裡設定的下次執行的時間間隔為5秒,可我們在使用scrapy時並沒有感受到5秒的間隔,因為在start方法中now預設設定為true,會即時執行。

這兒並沒有比較重要的啟動**;記錄了時間,將狀態進行了設定。並建立了乙個deferred的物件,會在關閉engine時呼叫。

@defer.inlinecallbacks

def start(self):

"""start the execution engine"""

assert not self.running, "engine already running"

self.start_time = time()

yield self.signals.send_catch_log_deferred(signal=signals.engine_started)

self.running = true

self._closewait = defer.deferred()

yield self._closewait

Scrapy框架的流程

那麼 scrapy是如何幫助我們抓取資料的呢?scrapy框架的工作流程 1.首先spiders 爬蟲 將需要傳送請求的url requests 經scrapyengine 引擎 交給scheduler 排程器 2.scheduler 排序,入隊 處理後,經scrapyengine,middlewa...

scrapy 網頁抓取時的定位問題

最近在做乙個簡單的靜態網頁內容抓取程式,在抓取過程中總是遇到定位不準確,資料返回值為空列表或者抓了一大堆非目標資訊的問題,讓我頭疼不已。思考之後,就想著做乙個簡單的歸納總結,以便以後抓取 時提高效率。1.鏈結命名方法 要做好準確網頁資料的定位,首先我認為要搞明白網頁資料位置的命名方法。這邊以中關村的...

scrapy爬蟲實戰 抓取NBA吧的內容

6 debug 7 資料存入資料庫 進入之前以及搭建好的虛擬環境 在anaconda的shell中輸入下面格式 scrapy shell 要爬取的 進入貼吧頁面的開發者模式 在瀏覽器上按f12 分析標籤 再次進入shell檢視需要的資料,同時觀察資料特徵 頁面中帖子的url位址 url list r...