關於爬蟲,你需要知道的requests庫

日拱一卒|數據挖掘012

Python 提供了很多模塊來支持 HTTP 協議的網絡編程,urllib、urllib2、urllib3、httplib、httplib2,都是和 HTTP 相關的模塊,看名字覺得很反人類,更糟糕的是這些模塊在 Python2 與 Python3 中有很大的差異,如果業務代碼要同時兼容 2 和 3,寫起來會讓人崩潰(Python之禪劉志軍)。

幸運地是後來有了一個非常驚豔的 HTTP 庫 requests。它實現了 HTTP 協議中絕大部分功能,提供的功能包括 Keep-Alive、連接池、Cookie持久化、內容自動解壓、HTTP代理、SSL認證、連接超時、Session等很多特性,最重要的是它同時兼容 python2 和 python3。

在介紹之前,如果您有時間,建議看看 關於爬蟲,你需要了解的HTTP協議 因爲requests庫是一個實現HTTP協議的python庫。

本篇推送涉及的代碼鏈接:https://github.com/piyixia100/daily-code/blob/master/requests.ipynb


首先pip install requests安裝requests庫(如果使用anaconda,因爲已經包含了,就不需要安裝)

http://www.baidu.com/爲例

HTTP協議中最常用的請求方法有:GET、POST、PUT、DELETE。GET 方法用於從服務器獲取資源,90%的爬蟲都是基於GET請求抓取數據。

請求返回的 Response 對象,它是對 HTTP 協議中服務端返回給瀏覽器的響應數據的封裝,響應的中的主要元素包括:狀態碼、原因短語、響應首部、響應體等等,這些屬性都封裝在Response 對象中。

響應首部和請求首部類似,用於對響應內容的補充,在首部裏面可以告知客戶端響應體的數據類型是什麼?響應內容返回的時間是什麼時候,響應體是否壓縮了,響應體最後一次修改的時間等等。

對於Chrome瀏覽器右鍵點擊“檢查”(Ctrl+Shift+I),可以看到響應頭、請求頭。


requests 除了支持 GET 請求外,還支持 HTTP 規範中的其它所有方法,包括 POST、PUT、DELTET、HEADT、OPTIONS方法。

定製請求頭
requests 可以很簡單地指定請求首部字段 Headers,比如有時要指定 User-Agent 僞裝成瀏覽器發送請求,以此來矇騙服務器。直接傳遞一個字典對象給參數 headers 即可。

構建請求查詢參數
很多URL都帶有很長一串參數,我們稱這些參數爲URL的查詢參數,用”?”附加在URL鏈接後面,多個參數之間用”&”隔開。

構建 POST 請求數據
requests 可以非常靈活地構建 POST 請求需要的數據,如果服務器要求發送的數據是表單數據,則可以指定關鍵字參數 data,如果要求傳遞 json 格式字符串參數,則可以使用json關鍵字參數,參數的值都可以字典的形式傳過去。

Response中的響應體
HTTP返回的響應消息中很重要的一部分內容是響應體,響應體在 requests 中處理非常靈活,與響應體相關的屬性有:content、text、json()。

content 是 byte 類型,適合直接將內容保存到文件系統或者傳輸到網絡中


text 是 str 類型,比如一個普通的 HTML 頁面,需要對文本進一步分析時,使用 text。



如果使用第三方開放平臺或者API接口爬取數據時,返回的內容是json格式的數據時,那麼可以直接使用json()方法返回一個經過json.loads()處理後的對象。


代理設置
當爬蟲頻繁地對服務器進行抓取內容時,很容易被服務器屏蔽掉,因此要想繼續順利的進行爬取數據,就需要使用代理。

超時設置
requests 發送請求時,默認請求下線程一直阻塞,直到有響應返回才處理後面的邏輯。如果沒有顯式指定了 timeout 值,requests 是不會自動進行超時處理的。如果遇到服務器沒有響應的情況時,整個應用程序一直處於阻塞狀態而沒法處理其他請求。

Session

HTTP協議是一中無狀態的協議,爲了維持客戶端與服務器之間的通信狀態,使用 Cookie 技術使之保持雙方的通信狀態。

有些網頁是需要登錄才能進行爬蟲操作的,而登錄的原理就是瀏覽器首次通過用戶名密碼登錄之後,服務器給客戶端發送一個隨機的Cookie,下次瀏覽器請求其它頁面時,就把剛纔的 cookie 隨着請求一起發送給服務器,這樣服務器就知道該用戶已經是登錄用戶。

構建一個session會話之後,客戶端第一次發起請求登錄賬戶,服務器自動把cookie信息保存在session對象中,發起第二次請求時requests 自動把session中的cookie信息發送給服務器,使之保持通信狀態

參考資料:
1.Python爬蟲準備:認識urllib/urllib2與requests
2.優雅的HTTP庫requests
3.Python爬蟲知識點梳理
4. requests庫初使用


公衆號推薦
Python之禪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章