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