網(wǎng)站建設(shè) 用英語網(wǎng)絡(luò)營銷現(xiàn)狀分析
目錄
- 二十六、Python爬蟲的Scrapy爬蟲框架
- 26.1 Scrapy下載安裝
- 26.2 創(chuàng)建Scrapy爬蟲項目
- 1) 創(chuàng)建第一個Scrapy爬蟲項目
- 26.3 Scrapy爬蟲工作流程
- 26.4 settings配置文件
二十六、Python爬蟲的Scrapy爬蟲框架
Scrapy 是一個基于 Twisted 實現(xiàn)的異步處理爬蟲框架,該框架使用純 Python 語言編寫。Scrapy 框架應(yīng)用廣泛,常用于數(shù)據(jù)采集、網(wǎng)絡(luò)監(jiān)測,以及自動化測試等。
提示:Twisted 是一個基于事件驅(qū)動的網(wǎng)絡(luò)引擎框架,同樣采用 Python 實現(xiàn)。
26.1 Scrapy下載安裝
Scrapy 支持常見的主流平臺,比如 Linux、Mac、Windows 等,因此你可以很方便的安裝它。本節(jié)以 Windows 系統(tǒng)為例,在 CMD 命令行執(zhí)行以下命令:
python -m pip install Scrapy
由于 Scrapy 需要許多依賴項,因此安裝時間較長,大家請耐心等待,關(guān)于其他平臺的安裝方法,可參考官方文檔《Scrapy安裝指南》。
驗證安裝,如下所示:
C:\Users\Administrator>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scrapy
>>> exit()
如果可以正常執(zhí)行exit()
操作,并且沒有出現(xiàn) ERROR 錯誤,則說明安裝成功。
26.2 創(chuàng)建Scrapy爬蟲項目
Scrapy 框架提供了一些常用的命令用來創(chuàng)建項目、查看配置信息,以及運行爬蟲程序。常用指令如下所示:
1) 創(chuàng)建第一個Scrapy爬蟲項目
下面創(chuàng)建名為 Baidu 的爬蟲項目,打開 CMD 命令提示符進(jìn)行如下操作:
C:\Users\Administrator>cd DesktopC:\Users\Administrator\Desktop>scrapy startproject Baidu
New Scrapy project 'Baidu', using template directory 'd:\python\python37\lib\site-packages\scrapy\templates\project', created in:C:\Users\Administrator\Desktop\Baidu
# 提示后續(xù)命令操作
You can start your first spider with:cd Baiduscrapy genspider example example.com
打開新建的項目“Baidu”會有以下項目文件,如圖所示:
接下來,創(chuàng)建一個爬蟲文件,如下所示:
C:\Users\Administrator\Desktop>cd Baidu
C:\Users\Administrator\Desktop\Baidu>scrapy genspider baidu www.baidu.com
Created spider 'baidu' using template 'basic' in module:Baidu.spiders.baidu
下面呈現(xiàn)了項目的目錄樹結(jié)構(gòu),以及各個文件的作用:
Baidu # 項目文件夾
├── Baidu # 用來裝載項目文件的目錄
│ ├── items.py # 定義要抓取的數(shù)據(jù)結(jié)構(gòu)
│ ├── middlewares.py # 中間件,用來設(shè)置一些處理規(guī)則
│ ├── pipelines.py # 管道文件,處理抓取的數(shù)據(jù)
│ ├── settings.py # 全局配置文件
│ └── spiders # 用來裝載爬蟲文件的目錄
│ ├── baidu.py # 具體的爬蟲程序
└── scrapy.cfg # 項目基本配置文件
從上述目錄結(jié)構(gòu)可以看出,Scrapy 將整個爬蟲程序分成了不同的模塊,讓每個模塊負(fù)責(zé)處理不同的工作,而且模塊之間緊密聯(lián)系。因此,您只需要在相應(yīng)的模塊編寫相應(yīng)的代碼,就可以輕松的實現(xiàn)一個爬蟲程序。
26.3 Scrapy爬蟲工作流程
Scrapy 框架由五大組件構(gòu)成,如下所示:
Scrapy 五大組件
名稱 | 作用說明 |
---|---|
Engine(引擎) | 整個 Scrapy 框架的核心,主要負(fù)責(zé)數(shù)據(jù)和信號在不同模塊間傳遞。 |
Scheduler(調(diào)度器) | 用來維護(hù)引擎發(fā)送過來的 request 請求隊列。 |
Downloader(下載器) | 接收引擎發(fā)送過來的 request 請求,并生成請求的響應(yīng)對象,將響應(yīng)結(jié)果返回給引擎。 |
Spider(爬蟲程序) | 處理引擎發(fā)送過來的 response, 主要用來解析、提取數(shù)據(jù)和獲取需要跟進(jìn)的二級URL,然后將這些數(shù)據(jù)交回給引擎。 |
Pipeline(項目管道) | 用實現(xiàn)數(shù)據(jù)存儲,對引擎發(fā)送過來的數(shù)據(jù)進(jìn)一步處理,比如存 MySQL 數(shù)據(jù)庫等。 |
在整個執(zhí)行過程中,還涉及到兩個 middlewares 中間件,分別是下載器中間件(Downloader Middlewares)和蜘蛛中間件(Spider
Middlewares),它們分別承擔(dān)著不同的作用:
- 下載器中間件,位于引擎和下載器之間,主要用來包裝 request 請求頭,比如 UersAgent、Cookies 和代理 IP 等
- 蜘蛛中間件,位于引擎與爬蟲文件之間,它主要用來修改響應(yīng)對象的屬性。
Scrapy 工作流程示意圖如下所示:
上述示意圖描述如下,當(dāng)一個爬蟲項目啟動后,Scrapy 框架會進(jìn)行以下工作:
- 第一步:由“引擎”向爬蟲文件索要第一個待爬取的 URL,并將其交給調(diào)度器加入 URL 隊列當(dāng)中(對應(yīng)圖中1/2步驟)。
- 第二步:調(diào)度器處理完請求后, 將第一個 URL 出隊列返回給引擎;引擎經(jīng)由下載器中間件將該 URL 交給下載器去下載 response 對象(對應(yīng)3/4步驟)。
- 第三步:下載器得到響應(yīng)對象后,將響應(yīng)結(jié)果交給引擎,引擎收到后,經(jīng)由蜘蛛中間件將響應(yīng)結(jié)果交給爬蟲文件(對應(yīng)5/6步驟)。
- 第四步:爬蟲文件對響應(yīng)結(jié)果進(jìn)行處理、分析,并提取出所需要的數(shù)據(jù)。
- 第五步:最后,提取的數(shù)據(jù)會交給管道文件去存數(shù)據(jù)庫,同時將需要繼續(xù)跟進(jìn)的二級頁面 URL 交給調(diào)度器去入隊列(對應(yīng)7/8/9步驟)。
上述過程會一直循環(huán),直到?jīng)]有要爬取的 URL 為止,也就是 URL 隊列為空時才會停止。
26.4 settings配置文件
在使用 Scrapy 框架時,還需要對配置文件進(jìn)行稍微改動。下面使用 Pycharm 打開剛剛創(chuàng)建的“Baidu”項目,對配置文件進(jìn)行如下修改:
# 1、定義User-Agent
USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
# 2、是否遵循robots協(xié)議,一般設(shè)置為False
ROBOTSTXT_OBEY = False
# 3、最大并發(fā)量,默認(rèn)為16
CONCURRENT_REQUESTS = 32
# 4、下載延遲時間
DOWNLOAD_DELAY = 1
其余常用配置項介紹:
# 設(shè)置日志級別,DEBUG < INFO < WARNING < ERROR < CRITICAL
LOG_LEVEL = ' '
# 將日志信息保存日志文件中,而不在終端輸出
LOG_FILE = ''
# 設(shè)置導(dǎo)出數(shù)據(jù)的編碼格式(主要針對于json文件)
FEED_EXPORT_ENCODING = ''
# 非結(jié)構(gòu)化數(shù)據(jù)的存儲路徑
IMAGES_STORE = '路徑'
# 請求頭,此處可以添加User-Agent、cookies、referer等
DEFAULT_REQUEST_HEADERS={'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}
# 項目管道,300 代表激活的優(yōu)先級 越小越優(yōu)先,取值1到1000
ITEM_PIPELINES={'Baidu.pipelines.BaiduPipeline':300
}
# 添加下載器中間件
DOWNLOADER_MIDDLEWARES = {}
想要了解更多關(guān)于 Scrapy 框架的知識,可參考官方文檔:https://docs.scrapy.org/en/latest/index.html