爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

嬌兮心有之發表於2018-12-17

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

摘要

本文作者:崔慶才

GitHub地址:https://github.com/Python3WebSpider/CookiesPool

小編推薦一本崔大大寫的網路爬蟲的書籍《Python3網路爬蟲開發實戰》

Python學習資料或者需要程式碼、視訊加Python學習群:960410445

很多時候,在爬取沒有登入的情況下,我們也可以訪問一部分頁面或請求一些介面,因為畢竟網站本身需要做SEO,不會對所有頁面都設定登入限制。

但是,不登入直接爬取會有一些弊端,弊端主要有以下兩點。

  1. 設定了登入限制的頁面無法爬取。比如論壇,部落格等等
  2. 如果沒有登入請求頻繁就很容易被限制或者IP直接被封

下面我們就第二種情況做一個簡單的實驗。以微博為例,我們先找到一個Ajax介面,例如新浪財經官方微博的資訊介面

如果用瀏覽器直接訪問,返回的資料是JSON格式,如下圖所示:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

但是如果頻繁訪問的話:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

登入微博賬號之後重新開啟此連結,則頁面正常顯示介面的結果,而未登入的頁面仍然顯示請求過於頻繁,如下圖所示:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

我們以新浪微博為例來實現一個Cookies池的搭建過程。

準備工作

搭建之前肯定需要一些微博的賬號。需要安裝好Redis資料庫並使其正常執行。需要安裝Python的RedisPy、requests、Selelnium、Flask庫。另外,還需要安裝Chrome瀏覽器並配置好ChromeDriver。

Cookies池架構

Cookies的架構和代理池類似,同樣是4個核心模組,如下圖所示。

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

Cookies池架構的基本模組分為4塊:儲存模組、生成模組、檢測模組、介面模組。

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

Cookies池的實現

儲存模組

需要儲存的內容無非就是賬號資訊和Cookies資訊。

建立兩個Hash,結構分別如下圖所示。

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

Hash的Key就是賬號,Value對應著密碼或者Cookies。

接下來我們建立一個儲存模組類,用以提供一些Hash的基本操作,程式碼如下:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

生成模組

生成模組負責獲取各個賬號資訊並模擬登入,隨後生成Cookies並儲存。

這裡主要邏輯就是找出那些還沒有對應Cookies的賬號,然後再逐個獲取Cookies,程式碼如下:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

因為我們對接的是新浪微博,前面我們已經破解了新浪微博的四宮格驗證碼,在這裡我們直接對接過來即可,不過現在需要加一個獲取Cookies的方法,並針對不同的情況返回不同的結果,邏輯如下所示:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

這裡返回結果的型別是字典,並且附有狀態碼status,在生成模組裡我們可以根據不同的狀態碼做不同的處理。例如

狀態碼為1的情況:表示成功獲取Cookies,我們只需要將Cookies儲存到資料庫即可。

狀態碼為2的情況:代表使用者名稱或密碼錯誤,那麼我們就應該把當前資料庫中儲存的賬號資訊刪除。

狀態碼為3的情況:代表登入失敗的一些錯誤,此時不能判斷是否使用者名稱或密碼錯誤,也不能成功獲取Cookies,那麼簡單提示再進行下一個處理即可。

程式碼實現如下所示:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

檢測模組

檢測模組需要做的就是檢測Cookies失效,然後將其從資料中移除。

我們還需要增加一個定時檢測模組,它負責遍歷池中的所有Cookies,同時設定好對應的檢測連結,我們用一個個Cookies去請求這個連結。

為了實現通用可擴充套件性,我們首先定義一個檢測器的父類,宣告一些通用元件,實現如下所示:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

如檢測微博的就可以定義為WeiboValidTester,實現其獨有的test()方法來檢測微博的Cookies是否合法,然後做相應的處理,所以在這裡我們還需要再加一個子類來繼承這個ValidTester,重寫其test()方法,實現如下:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

介面模組

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

排程模組

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

 

執行效果

三個程式全部開啟:

爬取網站總是被封?大神教你搭建Cookies池,以後遠離IP被封

相關文章