Python 輕鬆處理HTTP——Requests庫

第三方庫Requests 擅長處理那些複雜的HTTP請求,cookie, header等內容,並且支持 Python 2.6—2.7以及3.3—3.7

提供了比python2中urllib,urllib2和python3中urllib.request,urllib.repsonse等模塊更加簡潔方便的API


安裝Requests庫

$ pip install requests


發送請求

Reponse響應對象

Request請求對象

發送數據和提交表單

文件上傳

        流式上傳

        上傳多個文件

Cookie

超時處理

代理

SSL證書驗證

客戶端證書

流式響應體

CookieJar

會話Session


發送請求

>>> r = requests.get("http://www.baidu.com")    

        構建一個requests.Request對象,收到響應後返回requests.Response對象

        傳遞的關鍵字參數可以查看Request對象的構建方法參數


requests.get(url,params=None,**kwargs)

            params參數    接受字符串字典提供給URL作爲查詢字符串(query string)

>>> dic= {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=dic)
>>> r.url    #查看url
'http://httpbin.org/get?key2=value2&key1=value1'

                    字典裏值爲None的鍵都不會被添加到 URL 的查詢字符串裏。

                    可以將一個列表作爲值傳入

>>> dic= {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('http://httpbin.org/get', params=dic)
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key2=value3'


其他類型的請求方法

        requests.put(url, data=None,**kwargs)

        requests.post(url, data=None, json=None, **kwargs)

        requests.patch(url,data=None,**kwargs)

        requests.head(url,**kwargs)

        requests.delete(url,**kwargs)


requests.Reponse對象

            r.url              查看Reponse對象的URL

            r.request      返回響應的請求Request對象

            r.text            讀取服務器響應的內容,自動解碼來自服務器的內容,

            r.encoding      查看響應使用的編碼,同時可以覆蓋該屬性來改變編碼方式

                                    返回的編碼方式爲requests根據響應頭部推測,不要過度依賴此機制,有時gbk編碼會被使用ISO-8859-1編碼來處理

            r.content      以字節方式讀取請求響應體,可用於下載圖片視頻等,可以自動解碼gzip和deflate傳輸編碼的響應數據

            r.json()          使用requests內置的JSON解碼器解碼

                                    如果解碼失敗會拋出異常,有時即使唱功調用r.json()也並不意味着響應成功

                                    有的服務器會在失敗的響應中包含一個 JSON 對象(比如 HTTP 500 的錯誤細節)。

                                      這種 JSON 會被解碼返回。

                                                要檢查請求是否成功,請使用 r.raise_for_status()或者檢查r.status_code 是否和你的期望相同。

            r.raw                獲取來自服務器的原始套接字,請求方法應確保設置stream=True

            r.headers        以字典的形式返回服務器響應頭使用任意大小寫來傳遞給索引或get()方法訪問響應頭字段

            r.cookies          返回RequestsCookieJar對象,允許以字典方式訪問響應中包含的cookie

            r.history           該屬性是一個Response對象的列表,可用來追蹤重定向,對象的順序時按照最老到最近的請求排序

            r.status_code                返回響應狀態碼

            r.ok                                如果響應狀態嗎小於400則返回True

            r.raise_for_status()        針對響應碼拋出相應異常


requests.Request對象

    requests.request(method, url, **kwargs)

            method    爲請求方法http,https等等

            url             爲URL地址

            params      該參數作爲查詢字符串,字典或者字節流

            headers      作爲請求頭的字典,所有的header值必須時string, bytestring unicode

            allow_redirects    布爾值,True表示禁用重定向處理,False表示禁用重定向處理

                                                HEAD請求方法默認不使用重定向

            auth             接受元組或者HTTPBasicAuth類用於身份驗證


發送數據和提交表單     data參數

提交表單時應注意處理表單的URL,也就是表單字段的action屬性,應該將URL設置爲該action的地址,該地址可能爲絕對地址或相對地址,進行相應的轉換

            data            接受字典或包含元組的列表,字節流或文件對象作爲請求體

                                    傳遞字典給data參數,自帶你會自動編碼爲表單形式

                                    元組列表可以在表單多個元素使用同一個key時使用,

                                    還可以JSON編碼的數據作爲參數傳遞

>>> payload = (('key1', 'value1'), ('key1', 'value2')) 
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload)

                                    其他類型會直接作爲數據發送出去


            json            接受字典,並自動編碼爲JSON數據作爲請求體

           

文件上傳    files參數

                files    接受一個字典用於上傳文件

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)

                    可以顯示地設置文件名,文件類型和請求頭

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> r = requests.post(url, files=files)

                    也可以發送作爲文件接受的字符串

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)

                    要求使用二進制模式打開文件,因爲Request可能會試圖提供Content-length字段,這個值會被設爲文件的字節數,如果用文本模式打開可能會出錯


        流式上傳,可以發送大的數據流或文件,僅需爲請求體data參數提供一個文件對象即可,而無需先把他們讀入內存

with open('massive-body') as f:
    requests.post('http://some.url/streamed', data=f)

        上傳多個文件,需要把文件放到一個元組的列表中

#<input type="file" name="images" multiple="true" required="true"/>
#上傳多個圖像文件到表單
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [
        ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
        ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)

Cookie    cookies參數

        大多數網站都是用cookie來跟蹤用戶是否登陸,一旦登陸,就會將服務器生成的令牌,登陸有效期限和狀態跟蹤信息等信息保存在cookie中,網站會把cookie用作信息驗證,當瀏覽網站中每個頁面時都會發送給服務器

         但是對於網站比較複雜,會更改調整cookie,或者不想要在代碼中cookie時,可以使用會話Session對象來持續跟蹤會話信息

            cookies        接受字典或CookieJar對象

>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> r = requests.get('http://httpbin.org/cookies', cookies=jar)

超時    timeout參數

            爲了防止服務器不能及時響應,大部分發到外部服務器的請求端都應該帶timeout參數  

             如果沒有顯示指定timeout值,Requests一般不會進行超時處理,代碼可能會阻塞若干分鐘甚至更長時間

             超時可分爲連接超時,和讀取超時

                    連接超時指客戶端實現到遠程機器端口的連接(connect())時的超時時間

                    讀取超時指客戶端連接到服務器,併發送http請求後,等待服務器發送響應的時間  

                timeout        該參數設置多少秒後停止等待響應

                                        只針對連接過程有效,與下載響應體的時間無關

                                        可以傳遞一個元組,分別指定connect和read的timeout

r = requests.get('https://github.com', timeout=5)
r = requests.get('https://github.com', timeout=(3.05, 27))    
r = requests.get('https://github.com', timeout=None)        #設爲None爲永遠等待

代理    proxies參數

                proxies          接受一個字典參數來爲任意請求方法配置單個請求

                                也可以通過環境變量HTTP_PROXY和HTTPS_PROXY來配置代理

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

                                字典鍵爲請求方法,代理 URL 必須包含連接方式


                                如果代理需要使用HTTP Basic Auth,可以使用http://user:pasword@host語法

proxies = {
    "http": "http://user:[email protected]:3128/",
}

                                要爲某個特定的連接方式或者主機設置代理,使用 scheme://hostname 作爲 key,它會針對指定的主機和連接方式進行匹配。

proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}


SSL證書驗證    verify參數

            verify            該參數用於爲HTTPS驗證SSL證書,傳入CA_BUNDLE文件的路徑名,或者可信任CA證書文件的文件加路徑

                                    如果verify設爲文件夾路徑,文件加必須通過OpenSSL提供的c_rehash工具處理

                                    設爲False則表示忽略對SSL證書的驗證,默認爲True

                                    如果認證失敗會引發SSLError

                    verify僅用於主機證書,私有證書,需要傳遞CA_BUNDLE文件,也可以設置REQUEST_CA_BUNDLE環境變量


客戶端證書    cert參數

                cert              指定一個本地證書用於客戶端證書,可以時單個文件(包含密鑰和證書),或者一個包含兩個文件路徑的元組

                                        如果指定了錯誤路徑或無效證書會引發SSLError

                                        本地證書的私有key必須時解密狀態,目前不支持加密的key


流式響應體    stream參數

                stream        默認情況下,當進行網絡請求後,響應體會立即被下載,stream參數可以推遲下載響應體,直到訪問Response.content屬性

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)

                                    此時只有響應頭被下載,連接保持打開狀態,允許我們爲響應頭設置條件來獲取內容

if int(r.headers['content-length']) < TOO_LONG:
  content = r.content
  ...

CookieJar 

            requests.utils.add_dict_to_cookiejar(cookiejar, cookie_dict)

                將cookie_dict字典中數據添加到類型爲CookieJar的cookiejar參數中並返回


            request.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,overwrite=True)

                將cookie_dict字典中的數據插入到cookiejar對象中,如果overwrite爲False將不更改cookiejar參數對象,而是返回一個新對象


    request.cookies.RequestsCookieJar(policy=None) 構造一個RequestsCookieJar對象

            RequestsCookieJar對象可以按照字典方式操作,並有一些其他的方法

             cj.get(name, default=None)

            cj.get_dict()            返回字典形式

            cj.set(name,value)        

            cj.update()

            cj.clear_session_cookies()    清除會話cookie


會話Session

        會話對象可以爲請求保持某些參數,他也會在同一個Session實例發出的所有請求之間保持COOKIE

        如果向同一主機發送多個請求,底層TCP連接將會被重用


        requests.Session會話對象擁有主要的Requests API的所有方法

>>> s = requests.Session()
>>> s.get('http://httpbin.org/get')
使用上下文管理器,這樣就可以確保with代碼塊退出後即使發生一出場會話也能被關閉
>>> with requests.Session() as s:
>>>     s.get('http://httpbin.org/get')

       

會話可以爲請求方法提供缺省數據,任何傳遞給請求方法的字典都會與設置會話層數據合併,並且方法層的參數可以覆蓋會話層的數據

        不過就算使用了會話,方法層的參數不會被跨域請求保持

s = requests.Session()
#只會和第一個請求發送方法傳遞的cookie
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'

r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

        如果手動爲會話添加cookie,則使用Cookie utility函數來操作Session.cookies


      

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