- 實戰Python網絡爬蟲
- 黃永祥
- 1090字
- 2019-11-22 18:44:44
7.2 在Requests中使用緩存
Requests-Cache遵循Requests的使用規則:功能強大并使用簡單,整個緩存機制由install_cache()方法實現。install_cache()方法定義如下所示:

install_cache()定義了多個函數參數,每個參數的說明如下:
● cache_name:默認值為cache,這是對緩存的存儲文件進行命名。
● backend:設置緩存的存儲機制,默認值為None,即默認sqlite數據庫存儲。
● expire_after:設置緩存的有效時間,默認值None,即為永久有效。
● allowable_codes:設置HTTP的狀態碼,默認值為200。
● allowable_methods:設置請求方式,默認值是只允許GET請求才能生成緩存。
● session_factory:設置緩存的執行對象,由CachedSession類實現,該類是由Requests-Cache定義。
● **backend_options:設置存儲配置,若緩存的存儲選擇sqlite、redis或mongoDB數據庫,則該參數是設置數據庫的連接方式。
在實際應用中,install_cache()可以直接使用,無需設置任何參數,因為Requests-Cache已對相關的參數設置了默認值,這些默認值基本能滿足日常的開發需求。
使用Requests-Cache之前,首先創建一個簡單的網站系統,這是由Flask框架開發的Web系統,主要是方便驗證Requests-Cache的緩存功能。我們需要安裝Flask框架模塊,在CMD窗口下輸入pip指令(pip install flask)并等待安裝完成。然后創建MyFlask.py文件,并在文件里面編寫以下代碼:

上述代碼創建了一個簡單的網站首頁,網頁內容是“Hello World!”。在PyCharm或CMD窗口下運行MyFlask.py文件即可運行一個簡單的Web系統,網站的后臺信息如圖7-1所示。

圖7-1 網站的后臺信息
使用瀏覽器訪問圖上的地址鏈接即可看到網站的首頁,瀏覽器每次成功訪問網站,都會在網站后臺出現相關的請求信息。根據這個規則,使用Requests+Requests-Cache對網站進行兩次訪問,查看網站后臺請求信息的出現次數。如果請求信息只出現一次,說明爬蟲緩存正常使用,反之則說明Requests-Cache無法生成緩存。Requests-Cache的使用方法如下所示:

運行上述代碼,程序會依次輸出False和True, False代表第一次訪問還沒有生成相關的緩存;True代表第二次訪問就已有相關的緩存數據。同時代碼所在的文件路徑中會生成cache.sqlite文件,這是sqlite數據庫文件,用于存儲緩存信息。此外,網站后臺僅有一條請求信息,如圖7-2所示。

圖7-2 請求信息
如果短時間內多次訪問網站服務器,很容易遭到服務器的攔截,從而認定這些請求是通過爬蟲程序執行,而非人為操作,這是反爬蟲常見的機制之一。為了降低訪問頻率,可以在每個請求之間設置一個time.sleep()函數,雖然能降低訪問頻率,但這樣處理就顯得不太友好。因為兩次請求之間,第一次才是真正訪問網站后臺,而第二次是直接從數據庫讀取緩存數據,所以這兩次請求之間無需設置延時。
那么如何判斷這次請求是否已有緩存,每個請求之間應如何合理地設置延時等待?為此,Requests-Cache可以自定義鉤子函數,通過函數去合理判斷是否設置延時,函數的定義與使用方法如下:

從函數make_throttle_hook的結構可以看出,這種函數結構其實是一個裝飾器的定義過程。也就是說,通過定義裝飾器來判斷每次請求是否已有緩存數據,從而決定是否設置延時等待。