摘要
本文作者:崔慶才
GitHub地址:https://github.com/Python3WebSpider/CookiesPool
小編推薦一本崔大大寫的網(wǎng)絡(luò)爬蟲的書籍《Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》
推薦下我自己創(chuàng)建的Python學(xué)習(xí)交流群960410445摊唇,這是Python學(xué)習(xí)交流的地方咐蝇,不管你是小白還是大牛,小編都?xì)g迎巷查,不定期分享干貨有序,包括我整理的一份適合零基礎(chǔ)學(xué)習(xí)Python的資料和入門教程。
很多時(shí)候岛请,在爬取沒有登錄的情況下旭寿,我們也可以訪問(wèn)一部分頁(yè)面或請(qǐng)求一些接口,因?yàn)楫吘咕W(wǎng)站本身需要做SEO髓需,不會(huì)對(duì)所有頁(yè)面都設(shè)置登錄限制许师。
但是,不登錄直接爬取會(huì)有一些弊端僚匆,弊端主要有以下兩點(diǎn)微渠。
設(shè)置了登錄限制的頁(yè)面無(wú)法爬取。比如論壇咧擂,博客等等
如果沒有登錄請(qǐng)求頻繁就很容易被限制或者IP直接被封
下面我們就第二種情況做一個(gè)簡(jiǎn)單的實(shí)驗(yàn)逞盆。以微博為例,我們先找到一個(gè)Ajax接口松申,例如新浪財(cái)經(jīng)官方微博的信息接口
如果用瀏覽器直接訪問(wèn)云芦,返回的數(shù)據(jù)是JSON格式,如下圖所示:
但是如果頻繁訪問(wèn)的話:
登錄微博賬號(hào)之后重新打開此鏈接贸桶,則頁(yè)面正常顯示接口的結(jié)果舅逸,而未登錄的頁(yè)面仍然顯示請(qǐng)求過(guò)于頻繁,如下圖所示:
我們以新浪微博為例來(lái)實(shí)現(xiàn)一個(gè)Cookies池的搭建過(guò)程皇筛。
準(zhǔn)備工作
搭建之前肯定需要一些微博的賬號(hào)琉历。需要安裝好Redis數(shù)據(jù)庫(kù)并使其正常運(yùn)行。需要安裝Python的RedisPy水醋、requests旗笔、Selelnium、Flask庫(kù)拄踪。另外蝇恶,還需要安裝Chrome瀏覽器并配置好ChromeDriver。
Cookies池架構(gòu)
Cookies的架構(gòu)和代理池類似惶桐,同樣是4個(gè)核心模塊撮弧,如下圖所示。
Cookies池架構(gòu)的基本模塊分為4塊:存儲(chǔ)模塊姚糊、生成模塊想虎、檢測(cè)模塊、接口模塊叛拷。
Cookies池的實(shí)現(xiàn)
存儲(chǔ)模塊
需要存儲(chǔ)的內(nèi)容無(wú)非就是賬號(hào)信息和Cookies信息舌厨。
建立兩個(gè)Hash,結(jié)構(gòu)分別如下圖所示忿薇。
Hash的Key就是賬號(hào)裙椭,Value對(duì)應(yīng)著密碼或者Cookies。
接下來(lái)我們創(chuàng)建一個(gè)存儲(chǔ)模塊類署浩,用以提供一些Hash的基本操作揉燃,代碼如下:
生成模塊
生成模塊負(fù)責(zé)獲取各個(gè)賬號(hào)信息并模擬登錄,隨后生成Cookies并保存筋栋。
這里主要邏輯就是找出那些還沒有對(duì)應(yīng)Cookies的賬號(hào)炊汤,然后再逐個(gè)獲取Cookies,代碼如下:
因?yàn)槲覀儗?duì)接的是新浪微博,前面我們已經(jīng)破解了新浪微博的四宮格驗(yàn)證碼抢腐,在這里我們直接對(duì)接過(guò)來(lái)即可姑曙,不過(guò)現(xiàn)在需要加一個(gè)獲取Cookies的方法,并針對(duì)不同的情況返回不同的結(jié)果迈倍,邏輯如下所示:
這里返回結(jié)果的類型是字典伤靠,并且附有狀態(tài)碼status,在生成模塊里我們可以根據(jù)不同的狀態(tài)碼做不同的處理啼染。例如
狀態(tài)碼為1的情況:表示成功獲取Cookies宴合,我們只需要將Cookies保存到數(shù)據(jù)庫(kù)即可。
狀態(tài)碼為2的情況:代表用戶名或密碼錯(cuò)誤迹鹅,那么我們就應(yīng)該把當(dāng)前數(shù)據(jù)庫(kù)中存儲(chǔ)的賬號(hào)信息刪除卦洽。
狀態(tài)碼為3的情況:代表登錄失敗的一些錯(cuò)誤,此時(shí)不能判斷是否用戶名或密碼錯(cuò)誤斜棚,也不能成功獲取Cookies阀蒂,那么簡(jiǎn)單提示再進(jìn)行下一個(gè)處理即可。
代碼實(shí)現(xiàn)如下所示:
檢測(cè)模塊
檢測(cè)模塊需要做的就是檢測(cè)Cookies失效打肝,然后將其從數(shù)據(jù)中移除脂新。
我們還需要增加一個(gè)定時(shí)檢測(cè)模塊,它負(fù)責(zé)遍歷池中的所有Cookies粗梭,同時(shí)設(shè)置好對(duì)應(yīng)的檢測(cè)鏈接争便,我們用一個(gè)個(gè)Cookies去請(qǐng)求這個(gè)鏈接。
為了實(shí)現(xiàn)通用可擴(kuò)展性断医,我們首先定義一個(gè)檢測(cè)器的父類滞乙,聲明一些通用組件,實(shí)現(xiàn)如下所示:
如檢測(cè)微博的就可以定義為WeiboValidTester鉴嗤,實(shí)現(xiàn)其獨(dú)有的test()方法來(lái)檢測(cè)微博的Cookies是否合法斩启,然后做相應(yīng)的處理,所以在這里我們還需要再加一個(gè)子類來(lái)繼承這個(gè)ValidTester醉锅,重寫其test()方法兔簇,實(shí)現(xiàn)如下:
接口模塊
調(diào)度模塊
運(yùn)行效果
三個(gè)進(jìn)程全部開啟: