欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python requests庫(kù)用法實(shí)例詳解

 更新時(shí)間:2018年08月14日 10:02:42   作者:噴跑的豆子  
這篇文章主要介紹了Python requests庫(kù)用法,結(jié)合實(shí)例形式分析了Request庫(kù)的功能、安裝、請(qǐng)求創(chuàng)建、響應(yīng)等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python requests庫(kù)用法。分享給大家供大家參考,具體如下:

requests是Python中一個(gè)第三方庫(kù),基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫(kù)。它比 urllib 更加方便,可以節(jié)約我們大量的工作,完全滿足 HTTP 測(cè)試需求。接下來(lái)將記錄一下requests的使用:

安裝

要使用requests庫(kù)必須先要安裝:

pip install requests

創(chuàng)建請(qǐng)求

通過requests庫(kù)發(fā)出一個(gè)請(qǐng)求非常簡(jiǎn)單,首先我們先導(dǎo)入requests庫(kù):

import requests

現(xiàn)在我們嘗試創(chuàng)建一個(gè)請(qǐng)求,用來(lái)獲取百度的網(wǎng)頁(yè)信息:

result = requests.get('http://www.baidu.com/')

現(xiàn)在我們獲取到了一個(gè)Response對(duì)象result,我們可以從這個(gè)對(duì)象中獲得所有我們需要的所有信息。剛剛的栗子是使用的GET請(qǐng)求,接下來(lái)將使用requests庫(kù)進(jìn)行POST請(qǐng)求:

result = requests.post('http://www.baidu.com/',data={key:value})

很簡(jiǎn)單對(duì)吧?那么其他HTTP請(qǐng)求呢:PUT、DELETE、HEAD和OPTIONS呢?

result = requests.put('http://www.baidu.com/',data={key,value})
result = requests.head('http://www.baidu.com/')
result = requests.delete('http://www.baidu.com/')
result = requests.options('http://www.baidu.com/')

在URL中傳遞參數(shù)

你經(jīng)常想要在URL的查詢字符串中發(fā)送某種數(shù)據(jù)。如果你手動(dòng)構(gòu)建網(wǎng)址,那么這個(gè)數(shù)據(jù)會(huì)在問號(hào)后作為網(wǎng)址中的鍵值對(duì),例如https://www.baidu.com/s?wd=requests。請(qǐng)求允許你使用params關(guān)鍵字參數(shù)將這些參數(shù)作為字符串字典提供。舉個(gè)栗子,你想傳遞name=zhangsan并且age=18到https://www.baidu.com/s,你可以這樣寫:

data = {"name":"zhangsan","age":18}
result = requests.get("https://www.baidu.com/s",params=data)

此時(shí)我們打印一下URL,發(fā)現(xiàn)該URL已經(jīng)被正確編碼:

print result.url # https://www.baidu.com/s?name=zhangsan&age=18

也可以傳遞一個(gè)列表進(jìn)去:

data = {"name":"zhangsan","favorite":["football","basketball"]}
result = requests.get("https://www.baidu.com/s",params=data)
print result.url # https://www.baidu.com/s?name=zhangsan&favorite=football&favorite=basketball

響應(yīng)內(nèi)容

在上面的例子可以知道,我們每次請(qǐng)求之后都會(huì)返回一個(gè)對(duì)象,我們可以從此對(duì)象中獲取響應(yīng)內(nèi)容:

result = requests.get("https://api.github.com/events")
print result.text    # [{"id":"6924608641","type":"PushEvent",...}]

二進(jìn)制響應(yīng)內(nèi)容

print result.content  # b'[{"id":"6924656608","type":"CreateEvent",...}]'

JSON格式的響應(yīng)內(nèi)容,如果解碼失敗,result.json()將會(huì)引發(fā)異常

print result.json()     # [{"id":"6924608641","type":"PushEvent",...}]

請(qǐng)求將自動(dòng)解碼來(lái)自服務(wù)器的內(nèi)容。大多數(shù)unicode字符集都是無(wú)縫解碼的。我們也可以根據(jù)如下方法獲取當(dāng)前的編碼:

print result.encoding

如果響應(yīng)的內(nèi)容并不是你想要的編碼格式,你可以在調(diào)用result.text之前,對(duì)result.encoding進(jìn)行賦值,給予新的編碼格式。

要檢查一個(gè)請(qǐng)求是否成功,使用result.raise_for_status()或者result.status_code來(lái)檢查是否你期望的

套接字響應(yīng)

在極少數(shù)情況下,你希望從服務(wù)器中獲得是原始套接字響應(yīng),你可以通過result.raw來(lái)獲取。如果你想這樣做,確保你設(shè)置stream=True在你的初始請(qǐng)求。一旦你這樣操作了,你可以這樣:

result = requests.get("https://api.github.com/events",stream=True)
print result.raw        # <urllib3.response.HTTPResponse object at 0x10ce52dd8>
print result.raw.read(10)    # b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

通常情況下,我們使用如下這種模式來(lái)保存正在流式傳輸?shù)膬?nèi)容:

with open("info.txt","wb") as f:
  for item in result.iter_content(chunk_size=128):
    f.write(item)

自定義頭部

如果你想將自定義請(qǐng)求頭添加到請(qǐng)求當(dāng)中,只需要傳遞一個(gè)字典到headers參數(shù)即可。例如,在請(qǐng)求中指定我們的請(qǐng)求代理:

header = {"user-agent":'my_test/0001'}
result = requests.get("https://api.github.com/events",headers=header)

注意,請(qǐng)求頭的值必須是一個(gè)字符串,byte類型的字符串或者unicode。雖然允許unicode,但還是避免使用unicode

復(fù)雜的post請(qǐng)求

通常情況下,你想要發(fā)送一些表單編碼數(shù)據(jù),就像HTML表單一樣。要做到這一點(diǎn),你只需要將字典傳遞給data參數(shù)即可:

infoDict = {"name":"張三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=infoDict)

你也可以傳遞一個(gè)元組數(shù)據(jù):

tupleInfo = ("name","張三")
result = requests.post('http://127.0.0.1:5000/test/post',data=tupleInfo)

有時(shí)你需要發(fā)送一些非編碼格式的數(shù)據(jù),即你發(fā)送的是一個(gè)string而不是dict,那么數(shù)據(jù)將會(huì)直接發(fā)送:

import json
infoDict = {"name":"張三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=json.dumps(infoDict))

如果你想要發(fā)送一個(gè)字典數(shù)據(jù),你可以通過它使用json參數(shù),它會(huì)自動(dòng)編碼:

infoDict = {"name":"張三"}
result = requests.post('http://127.0.0.1:5000/test/post',json=infoDict)

注意,如果你傳遞了data參數(shù)或者files,那么json將會(huì)被忽略

post上傳文件

requests上傳文件其實(shí)很簡(jiǎn)單:

with open('info.txt','rb') as f:
  result = requests.post('http://localhost:5000/post',files={"files":f})

響應(yīng)狀態(tài)碼

我們執(zhí)行完一個(gè)請(qǐng)求之后,我們可以使用如下方法查看狀態(tài)碼,檢測(cè)請(qǐng)求是否成功:

result = requests.get('http://localhost:5000/get')
print result.status_code  # 200

當(dāng)返回200,表示請(qǐng)求執(zhí)行成功,我們還可以使用如下方法判斷請(qǐng)求是否成功,True為成功,F(xiàn)alse不成功:

print result.staatus_code == requests.codes.ok    # True

當(dāng)我們執(zhí)行一個(gè)錯(cuò)誤的請(qǐng)求(4XX客戶端錯(cuò)誤,5XX服務(wù)器錯(cuò)誤)時(shí),我們可以以下方法來(lái)拋出異常進(jìn)行檢車:

result = requests.get('http://localhost:5000/get')
print result.status_code      # 404
print result.raise_for_status()   # Traceback (most recent call last): ...

但是如果我們的請(qǐng)求是執(zhí)行成功的,即狀態(tài)碼為200,此時(shí)raise_for_status()的值將會(huì)是None

響應(yīng)頭

我們可以使用Python字典來(lái)查看服務(wù)器的響應(yīng)頭文件:

print result.headers    # {'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '2', 'Server': 'Werkzeug/0.12.2 Python/2.7.10', 'Date': 'Sun, 03 Dec 2017 14:15:32 GMT'}

Cookies

如果響應(yīng)包含了Cookie,你可以這樣快速的訪問它:

result = requests.get('http://localhost:5000/get')
print result.cookies['userName']

或者你需要將自己的Cookie發(fā)送給服務(wù)器,你可以使用cookies參數(shù):

cookie = {'userName':'zhangsan'}
result = requests.get('http://localhost:5000/get',cookies=cookie)

RequestCookieJar提供了一個(gè)完整的接口,適合在多個(gè)域和路徑中使用,它將返回一個(gè)Cookie,所以它也可以被傳入到cookies參數(shù)中

c = requests.cookies.RequestsCookieJar()
c.set('userName','zhangsan',domain='http://localhost:5000',path='/get')
result = requests.get('http://localhost:5000/get',cookies=c)

Session對(duì)象

Session對(duì)象允許你在請(qǐng)求中保存某些參數(shù),它將在所有由會(huì)話實(shí)例創(chuàng)建的請(qǐng)求中保存Cookie,并將使用urllib3連接池。如果你想同一主機(jī)發(fā)出多個(gè)請(qǐng)求,則會(huì)重新使用底層的TCP連接,這將使性能顯著提高。Session具有主API的所有請(qǐng)求方法:

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

但是請(qǐng)注意,方法級(jí)參數(shù)不會(huì)保存在請(qǐng)求,即使使用一個(gè)session。這個(gè)栗子只會(huì)發(fā)送第一個(gè)請(qǐng)求的Cookie,不會(huì)發(fā)送第二個(gè):

result = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(result.text)
# '{"cookies": {"from-my": "browser"}}'
result = s.get('http://httpbin.org/cookies')
print(result.text)
# '{"cookies": {}}'

請(qǐng)求和響應(yīng)對(duì)象

每當(dāng)你發(fā)起一個(gè)GET請(qǐng)求,你都在做兩件事。首先,構(gòu)造一個(gè)Request將被發(fā)送到服務(wù)器的對(duì)象來(lái)請(qǐng)求或查詢某個(gè)資源。其次,Response一旦從服務(wù)器中獲得響應(yīng),就會(huì)生成一個(gè)對(duì)象。該Response對(duì)象包含服務(wù)器鎖返回的所有信息,并且還包含Request你最初創(chuàng)建的對(duì)象。這是一個(gè)簡(jiǎn)單的請(qǐng)求,從維基百科的服務(wù)器獲取一些非常重要的信息:

result = requests.get('http://en.wikipedia.org/wiki/Monty_Python')

現(xiàn)在我們需要獲取服務(wù)器發(fā)送給我們的頭文件信息:

print result.headers

如果我們需要獲取發(fā)送給服務(wù)器的頭文件信息,我們可以這樣:

print result.request.headers

SSL證書驗(yàn)證

請(qǐng)求將驗(yàn)證HTTPS請(qǐng)求的SSL證書,就像Web瀏覽器一樣。默認(rèn)情況下,啟用SSL驗(yàn)證,如果無(wú)法驗(yàn)證SSL證書,將會(huì)引發(fā)SSLError:

result = reqests.get('https://kyfw.12306.cn/otn/login/init')
# requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

為了避免出現(xiàn)這個(gè)錯(cuò)誤,我們可以將CA證書的CA_BUNDLE文件或目錄傳遞給verify參數(shù)里面:

result = reqests.get('https://kyfw.12306.cn/otn/login/init',verify='/path/...')

或者使用Session方式存儲(chǔ)起來(lái):

s = Session()
s.verify='/path/...'
result = s.get('https://kyfw.12306.cn/otn/login/init')

如果將verify參數(shù)設(shè)置為False,請(qǐng)求也可以忽略SSL證書:

result = requests.get('https://kyfw.12306.cn/otn/login/init',verify=False)

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 對(duì)Python中 \r, \n, \r\n的徹底理解

    對(duì)Python中 \r, \n, \r\n的徹底理解

    這篇文章主要介紹了對(duì)Python中 \r, \n, \r\n的徹底理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-03-03
  • 在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1的詳細(xì)步驟

    在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1的

    這篇文章主要介紹了如何在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Python+PyQt5實(shí)現(xiàn)簡(jiǎn)歷自動(dòng)生成工具

    Python+PyQt5實(shí)現(xiàn)簡(jiǎn)歷自動(dòng)生成工具

    在當(dāng)今競(jìng)爭(zhēng)激烈的求職市場(chǎng)中,一份專業(yè)、規(guī)范的簡(jiǎn)歷是獲得面試機(jī)會(huì)的關(guān)鍵,本文介紹了一個(gè)基于PyQt5的自動(dòng)化簡(jiǎn)歷生成工具,有需要的小伙伴可以參考一下
    2025-05-05
  • python解包用法詳解

    python解包用法詳解

    在本篇文章里小編給大家整理的是關(guān)于python解包用法詳解內(nèi)容,有需要的朋友們可以跟著一起學(xué)習(xí)下。
    2021-02-02
  • Python使用Pandas和Matplotlib按中值對(duì)箱形圖進(jìn)行排序

    Python使用Pandas和Matplotlib按中值對(duì)箱形圖進(jìn)行排序

    箱形圖是可視化數(shù)據(jù)分布的強(qiáng)大工具,因?yàn)樗鼈兲峁┝藢?duì)數(shù)據(jù)集內(nèi)的散布、四分位數(shù)和離群值的洞察,在本文中,我們將探索如何在Python中使用Pandas和Matplotlib按中值對(duì)箱形圖進(jìn)行排序,需要的朋友可以參考下
    2025-04-04
  • PyQt5實(shí)現(xiàn)將Matplotlib圖像嵌入到Scoll Area中顯示滾動(dòng)條效果

    PyQt5實(shí)現(xiàn)將Matplotlib圖像嵌入到Scoll Area中顯示滾動(dòng)條效果

    我想知道是否有一種方法可以在matplotlib上顯示滾動(dòng)條(水平或垂直),顯示包含多個(gè)子槽(sublot2grid)的頁(yè)面(plt.show).下面就通過本文給大家分享PyQt5實(shí)現(xiàn)將Matplotlib圖像嵌入到Scoll Area中顯示滾動(dòng)條效果,對(duì)PyQt5 Matplotlib圖像嵌入相關(guān)知識(shí)感興趣的的朋友一起看看吧
    2021-05-05
  • python中的位置參數(shù)和關(guān)鍵字參數(shù)詳解

    python中的位置參數(shù)和關(guān)鍵字參數(shù)詳解

    位置參數(shù)和關(guān)鍵字參數(shù)是 Python 中的兩種不同類型的函數(shù)參數(shù)傳遞方式,位置參數(shù)依賴于參數(shù)的位置順序,而關(guān)鍵字參數(shù)通過參數(shù)名傳遞,不受位置影響,本文通過代碼示例給大家詳細(xì)介紹了python中的位置參數(shù)和關(guān)鍵字參數(shù),需要的朋友可以參考下
    2023-12-12
  • Django的ALLOWED_HOSTS配置方法

    Django的ALLOWED_HOSTS配置方法

    allowed_hosts 參數(shù)是用于設(shè)置 Django 的域名白名單的,本文主要介紹了Django的ALLOWED_HOSTS配置方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 解決python使用list()時(shí)總是報(bào)錯(cuò)的問題

    解決python使用list()時(shí)總是報(bào)錯(cuò)的問題

    這篇文章主要介紹了解決python使用list()時(shí)總是報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-05-05
  • Python中join函數(shù)簡(jiǎn)單代碼示例

    Python中join函數(shù)簡(jiǎn)單代碼示例

    這篇文章主要介紹了Python中join函數(shù)簡(jiǎn)單代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論