如何用Flask和Redis來動態維護Cookies池

爲什麼要用Cookies池

  • 目標網站需要登錄才能爬取,例如新浪微博。
  • 爬取過程中,如果請求頻率過高,會導致封號。
  • 這就需要維護多個賬號的Cookies池實現大規模爬取。

Cookies池的要求

  • 自動登錄更新
  • 定時驗證篩選
  • 提供外部接口

Cookies池的架構

在這裏插入圖片描述
首先,需要有一個賬號隊列,把一些賬號密碼存到數據庫裏,生成器即程序從隊列裏面拿出賬號密碼,自動地進行登錄,並獲取登錄的Cookies,然後放到Cookies隊列裏。定時檢測器從Cookies隊列裏定期地隨機選出一些Cookies,並用這些Cookies請求網頁,如果請求成功就放回隊列,否則從隊列裏剔除,這樣就能做到實時更新,保證Cookies隊列裏的Cookies都是可用的。此外,還需要提供一個API接口,使外部程序能夠從隊列裏獲取到Cookies。

Cookies池的實現

源碼可以參考:

https://github.com/Germey/CookiesPool
https://github.com/Python3WebSpider/CookiesPool
在這裏插入圖片描述
我們從github上下載這個項目並且在pycharm中打開。
首先需要安裝必要的依賴:
pip3 install -r requirements.txt
然後需要在config.py文件中配置數據庫:
在這裏插入圖片描述
這個需要根據實際情況配置了。
接下來要將微博小號導入到數據庫中。
微博小號可以到網站上購買(現在某寶似乎搜不到了,可以用百度找,3、4毛錢一個小號,安全起見可以先購買少量進行嘗試)。
運行importer.py後,將賬號密碼批量複製到命令行中,回車即可實現導入數據庫:
在這裏插入圖片描述
之後可以在Redis中看到對應的數據:
在這裏插入圖片描述
因爲使用小號登錄時,會需要輸入驗證碼,爲了效率,我們需要通過“雲打碼”這個平臺的協助來實現自動打碼,網址:http://www.yundama.com/。註冊之後,將賬號密碼信息配置到config.py:
在這裏插入圖片描述
並且可以在賬號中充值少量的金額,作爲打碼的花費(一張新浪的驗證碼花費爲1分錢多一點兒)。

config.py文件中,定義了一些參數,下方有三個進程開關:
在這裏插入圖片描述
當需要使用某個進程時,把參數設置爲True即可。
如果以上步驟都準備好了,我們可以同時把所有進程的開關都打開,然後運行run.py
在這裏插入圖片描述
可以看到生成器開始工作,如果數據庫中的賬號沒有cookies信息,那麼就會取出這個賬號進行登錄,登錄成功後的cookie會保存下來,同時驗證器會對已經保存的cookies進行驗證。
在這裏插入圖片描述
全部生成完畢後效果如下:
在這裏插入圖片描述
所有賬號的cookies都已經生成並保存了。
這個cookies池的實現,爲之後大規模的爬取做好了準備。
需要注意的是:

  • 新浪小號安全性不高,指不定什麼時候就不能用了。
  • 生成cookies的時候,新浪有可能因爲同ip登錄次數過多而拒絕登錄,那麼程序就會在下個週期再次試驗,所以全部賬號都成功獲取cookies需要花費一定的時間。
  • 同ip登錄太多賬號有可能導致封號,所以可以與代理池配合起來使用。
  • Cookies池實現的具體細節可以閱讀源代碼。
  • 程序提供了擴展接口,如果要實現別的網站的cookies池,可以到配置文件以及具體函數中進行添加。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章