摘要 本文作者:崔慶才 GitHub地址:https://github.com/Python3WebSpider/CookiesPool 小編推薦一本崔大大寫的網路爬蟲的書籍《Python3網路爬蟲開發實戰》 Python學習交流群:125240963即可獲取 很多時候,在爬取沒有登錄的情況下,我們 ...
摘要
本文作者:崔慶才
GitHub地址:https://github.com/Python3WebSpider/CookiesPool
小編推薦一本崔大大寫的網路爬蟲的書籍《Python3網路爬蟲開發實戰》
Python學習交流群:125240963即可獲取
很多時候,在爬取沒有登錄的情況下,我們也可以訪問一部分頁面或請求一些介面,因為畢竟網站本身需要做SEO,不會對所有頁面都設置登錄限制。
但是,不登錄直接爬取會有一些弊端,弊端主要有以下兩點。
- 設置了登錄限制的頁面無法爬取。比如論壇,博客等等
- 如果沒有登錄請求頻繁就很容易被限制或者IP直接被封
下麵我們就第二種情況做一個簡單的實驗。以微博為例,我們先找到一個Ajax介面,例如新浪財經官方微博的信息介面
如果用瀏覽器直接訪問,返回的數據是JSON格式,如下圖所示:
但是如果頻繁訪問的話:
登錄微博賬號之後重新打開此鏈接,則頁面正常顯示介面的結果,而未登錄的頁面仍然顯示請求過於頻繁,如下圖所示:
我們以新浪微博為例來實現一個Cookies池的搭建過程。
準備工作
搭建之前肯定需要一些微博的賬號。需要安裝好Redis資料庫並使其正常運行。需要安裝Python的RedisPy、requests、Selelnium、Flask庫。另外,還需要安裝Chrome瀏覽器並配置好ChromeDriver。
Cookies池架構
Cookies的架構和代理池類似,同樣是4個核心模塊,如下圖所示。
Cookies池架構的基本模塊分為4塊:存儲模塊、生成模塊、檢測模塊、介面模塊。
Cookies池的實現
存儲模塊
需要存儲的內容無非就是賬號信息和Cookies信息。
建立兩個Hash,結構分別如下圖所示。
Hash的Key就是賬號,Value對應著密碼或者Cookies。
接下來我們創建一個存儲模塊類,用以提供一些Hash的基本操作,代碼如下:
生成模塊
生成模塊負責獲取各個賬號信息並模擬登錄,隨後生成Cookies並保存。
這裡主要邏輯就是找出那些還沒有對應Cookies的賬號,然後再逐個獲取Cookies,代碼如下:
因為我們對接的是新浪微博,前面我們已經破解了新浪微博的四宮格驗證碼,在這裡我們直接對接過來即可,不過現在需要加一個獲取Cookies的方法,並針對不同的情況返回不同的結果,邏輯如下所示:
這裡返回結果的類型是字典,並且附有狀態碼status,在生成模塊里我們可以根據不同的狀態碼做不同的處理。例如
狀態碼為1的情況:表示成功獲取Cookies,我們只需要將Cookies保存到資料庫即可。
狀態碼為2的情況:代表用戶名或密碼錯誤,那麼我們就應該把當前資料庫中存儲的賬號信息刪除。
狀態碼為3的情況:代表登錄失敗的一些錯誤,此時不能判斷是否用戶名或密碼錯誤,也不能成功獲取Cookies,那麼簡單提示再進行下一個處理即可。
代碼實現如下所示:
檢測模塊
檢測模塊需要做的就是檢測Cookies失效,然後將其從數據中移除。
我們還需要增加一個定時檢測模塊,它負責遍歷池中的所有Cookies,同時設置好對應的檢測鏈接,我們用一個個Cookies去請求這個鏈接。
為了實現通用可擴展性,我們首先定義一個檢測器的父類,聲明一些通用組件,實現如下所示:
如檢測微博的就可以定義為WeiboValidTester,實現其獨有的test()方法來檢測微博的Cookies是否合法,然後做相應的處理,所以在這裡我們還需要再加一個子類來繼承這個ValidTester,重寫其test()方法,實現如下:
介面模塊
調度模塊
運行效果
三個進程全部開啟:
Python學習交流群:125240963領取小編精心準備的海量Python學習資料