Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
原文地址https://www.cnblogs.com/zhaof/p/7173397.html
這一篇文章主要是為了對scrapy框架的工作流程以及各個組件功能的介紹
Scrapy目前已經(jīng)可以很好的在python3上運行
Scrapy使用了Twisted作為框架,Twisted有些特殊的地方是它是事件驅(qū)動的,并且比較適合異步的代碼。對于會阻塞線程的操作包含訪問文件、數(shù)據(jù)庫或者Web、產(chǎn)生新的進程并需要處理新進程的輸出(如運行shell命令)、執(zhí)行系統(tǒng)層次操作的代碼(如等待系統(tǒng)隊列),Twisted提供了允許執(zhí)行上面的操作但不會阻塞代碼執(zhí)行的方法。
Scrapy data flow(流程圖)
?
Scrapy數(shù)據(jù)流是由執(zhí)行的核心引擎(engine)控制,流程是這樣的:
1、爬蟲引擎ENGINE獲得初始請求開始抓取。?
2、爬蟲引擎ENGINE開始請求調(diào)度程序SCHEDULER,并準(zhǔn)備對下一次的請求進行抓取。?
3、爬蟲調(diào)度器返回下一個請求給爬蟲引擎。?
4、引擎請求發(fā)送到下載器DOWNLOADER,通過下載中間件下載網(wǎng)絡(luò)數(shù)據(jù)。?
5、一旦下載器完成頁面下載,將下載結(jié)果返回給爬蟲引擎ENGINE。?
6、爬蟲引擎ENGINE將下載器DOWNLOADER的響應(yīng)通過中間件MIDDLEWARES返回給爬蟲SPIDERS進行處理。?
7、爬蟲SPIDERS處理響應(yīng),并通過中間件MIDDLEWARES返回處理后的items,以及新的請求給引擎。?
8、引擎發(fā)送處理后的items到項目管道,然后把處理結(jié)果返回給調(diào)度器SCHEDULER,調(diào)度器計劃處理下一個請求抓取。?
9、重復(fù)該過程(繼續(xù)步驟1),直到爬取完所有的url請求。
各個組件介紹
爬蟲引擎(ENGINE)
爬蟲引擎負責(zé)控制各個組件之間的數(shù)據(jù)流,當(dāng)某些操作觸發(fā)事件后都是通過engine來處理。
調(diào)度器(SCHEDULER)
調(diào)度接收來engine的請求并將請求放入隊列中,并通過事件返回給engine。
下載器(DOWNLOADER)
通過engine請求下載網(wǎng)絡(luò)數(shù)據(jù)并將結(jié)果響應(yīng)給engine。
Spider
Spider發(fā)出請求,并處理engine返回給它下載器響應(yīng)數(shù)據(jù),以items和規(guī)則內(nèi)的數(shù)據(jù)請求(urls)返回給engine。
管道項目(item pipeline)
負責(zé)處理engine返回spider解析后的數(shù)據(jù),并且將數(shù)據(jù)持久化,例如將數(shù)據(jù)存入數(shù)據(jù)庫或者文件。
下載中間件
下載中間件是engine和下載器交互組件,以鉤子(插件)的形式存在,可以代替接收請求、處理數(shù)據(jù)的下載以及將結(jié)果響應(yīng)給engine。
spider中間件
spider中間件是engine和spider之間的交互組件,以鉤子(插件)的形式存在,可以代替處理response以及返回給engine items及新的請求集。
如何創(chuàng)建Scrapy項目
創(chuàng)建Scrapy項目
創(chuàng)建scrapy項目的命令是scrapy startproject 項目名,創(chuàng)建一個爬蟲
進入到項目目錄scrapy genspider 爬蟲名字 爬蟲的域名,例子如下:
scrapy項目結(jié)構(gòu)
items.py 負責(zé)數(shù)據(jù)模型的建立,類似于實體類。
middlewares.py 自己定義的中間件。
pipelines.py 負責(zé)對spider返回數(shù)據(jù)的處理。
settings.py 負責(zé)對整個爬蟲的配置。
spiders目錄 負責(zé)存放繼承自scrapy的爬蟲類。
scrapy.cfg scrapy基礎(chǔ)配置
?
轉(zhuǎn)載于:https://www.cnblogs.com/111testing/p/10325358.html
總結(jié)
以上是生活随笔為你收集整理的Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue——显示微信用户名称中enjoin
- 下一篇: 《利用Python》进行数据分析:Num