requests
是一個(gè)非常流行的 Python HTTP 第三方庫(kù)耘戚,它允許你發(fā)送各種 HTTP 請(qǐng)求嗡髓,處理 cookies、會(huì)話收津、連接池饿这、重定向浊伙、多種認(rèn)證方式等,使得處理 HTTP 請(qǐng)求變得非常便捷长捧。
安裝 Requests 庫(kù)
首先嚣鄙,確保你已經(jīng)安裝了 requests
庫(kù)。如果沒(méi)有串结,可以通過(guò) pip 安裝:
pip install requests
導(dǎo)入 Requests 模塊
在使用前需要先導(dǎo)入 requests
模塊:
import requests
一哑子、HTTP請(qǐng)求概覽
? 常用方法
requests
庫(kù)提供了一個(gè)簡(jiǎn)單易用的 API 來(lái)發(fā)送 HTTP 請(qǐng)求。以下是一些基本的請(qǐng)求方法:
-
get(url, **kwargs)
: 發(fā)送一個(gè)GET請(qǐng)求肌割。 -
post(url, data=None, **kwargs)
: 發(fā)送一個(gè)POST請(qǐng)求卧蜓,data
可以是字典、字節(jié)或文件對(duì)象把敞。 -
put(url, data=None, **kwargs)
: 發(fā)送一個(gè)PUT請(qǐng)求烦却。 -
delete(url, **kwargs)
: 發(fā)送一個(gè)DELETE請(qǐng)求。 -
head(url, **kwargs)
: 發(fā)送一個(gè)HEAD請(qǐng)求先巴,只獲取頁(yè)面的HTTP頭信息其爵。 -
options(url, **kwargs)
: 發(fā)送一個(gè)OPTIONS請(qǐng)求,獲取服務(wù)器支持的HTTP方法伸蚯。 -
patch(url, data=None, **kwargs)
: 發(fā)送一個(gè)PATCH請(qǐng)求摩渺。import requests # 引入requests庫(kù) payload = {'key1': 'value1', 'key2': 'value2'} response = requests.get('http://example.com') response = requests.post('http://example.com/submit', data=payload) response = requests.put('http://example.com/put', data={'key': 'value'}) response = requests.delete('http://example.com/delete') response = requests.head('http://example.com/get')
? 常用參數(shù)
使用 requests
庫(kù)時(shí),除了必填的 url
參數(shù)剂邮,你可以選填其他參數(shù)來(lái)自定義請(qǐng)求:
-
headers
: 字典摇幻,用于自定義HTTP請(qǐng)求頭。 -
cookies
: 字典挥萌,或RequestsCookieJar
對(duì)象绰姻,包含 cookies。 -
auth
: 元組引瀑,用于HTTP認(rèn)證的憑據(jù)狂芋。第一個(gè)元素是用戶名,第二個(gè)元素是密碼憨栽。 -
params
: 字典帜矾,用于將表單數(shù)據(jù)附加到URL的查詢字符串中(GET、POST請(qǐng)求)屑柔。 -
data
: 字典或類似字典的對(duì)象屡萤,用于表單數(shù)據(jù)的提交。(POST掸宛、PUT請(qǐng)求) -
json
: 字典或類似字典的對(duì)象死陆,用于發(fā)送JSON數(shù)據(jù)。(POST唧瘾、PUT請(qǐng)求) -
files
: 字典{'表單字段名': ('文件名', 文件對(duì)象)}
措译,用于上傳文件迫像。(POST請(qǐng)求) -
stream
: 布爾值,用于流式下載瞳遍。默認(rèn)值False
闻妓,為True
逐塊讀取響應(yīng)體減少內(nèi)存使用。 -
timeout
: 浮點(diǎn)數(shù)或元組掠械,用于指定請(qǐng)求的超時(shí)時(shí)間(秒)由缆。默認(rèn)無(wú)限期地等待。 -
verify
: 布爾值猾蒂,或到CA證書(shū)包的路徑均唉。默認(rèn)值True
,為False
不驗(yàn)證服務(wù)器SSL證書(shū)肚菠。 -
cert
: 字符串或元組舔箭,用于傳遞客戶端證書(shū)文件的路徑,或者證書(shū)和私鑰文件的路徑蚊逢。 -
allow_redirects
: 布爾值层扶,是否允許重定向。默認(rèn)為True
允許重定向烙荷。 -
proxies
: 字典镜会,用于配置代理。
? 其他功能
除了這些基本的HTTP方法终抽,requests
庫(kù)還提供了以下功能:
-
Session
對(duì)象:允許你跨請(qǐng)求保持某些參數(shù)戳表,例如cookies。 -
Response
對(duì)象:包含服務(wù)器響應(yīng)的所有信息昼伴,如狀態(tài)碼匾旭、文本內(nèi)容、headers等圃郊。 -
RequestException
:當(dāng)請(qǐng)求遇到問(wèn)題時(shí)拋出的異常价涝。 -
Timeout
:用于設(shè)置請(qǐng)求的超時(shí)時(shí)間。 -
TooManyRedirects
:當(dāng)請(qǐng)求重定向次數(shù)超過(guò)設(shè)定值時(shí)拋出的異常描沟。 -
Request
:用于創(chuàng)建一個(gè)請(qǐng)求對(duì)象飒泻,可以自定義請(qǐng)求的各個(gè)方面鞭光。
二吏廉、請(qǐng)求參數(shù)示例
- headers:
- 字典,用于自定義HTTP請(qǐng)求頭惰许。
headers = {'User-Agent': 'Mozilla/5.0 (compatible; YourBot/0.1)'} response = requests.get('http://example.com', headers=headers)
- cookies:
- 字典席覆,或
RequestsCookieJar
對(duì)象,包含 cookies汹买。cookies = {'session_token': '123456789'} response = requests.get('http://example.com', cookies=cookies)
- auth:
- 元組佩伤,用于HTTP認(rèn)證的憑據(jù)聊倔。第一個(gè)元素是用戶名,第二個(gè)元素是密碼生巡。requests 庫(kù)會(huì)自動(dòng)將這些認(rèn)證信息編碼并附加到請(qǐng)求的 HTTP 頭中耙蔑。
注意事項(xiàng)
▋ 確保在發(fā)送認(rèn)證信息時(shí)使用安全的連接(HTTPS),以避免認(rèn)證信息在傳輸過(guò)程中被截獲孤荣。
▋ 某些服務(wù)器可能不支持所有類型的 HTTP 認(rèn)證甸陌,因此在使用前應(yīng)確認(rèn)服務(wù)器支持的認(rèn)證方式。⑴ 基本認(rèn)證(Basic Auth)
# 定義認(rèn)證信息 username, password = 'user', 'pass' # 使用基本認(rèn)證發(fā)起 GET 請(qǐng)求 auth = (username, password) response = requests.get('http://example.com', auth=auth)
⑵ 摘要認(rèn)證(Digest Auth)
from requests.auth import HTTPDigestAuth username, password = 'user', 'pass' # 使用摘要認(rèn)證發(fā)起 GET 請(qǐng)求 auth = HTTPDigestAuth(username, password) response = requests.get('http://example.com', auth=auth)
⑶ 令牌認(rèn)證(Token Auth)
# 定義令牌 token = 'your_access_token' # 定義請(qǐng)求頭盐股,包含令牌 headers = {'Authorization': f'Token {token}'} # 使用令牌認(rèn)證發(fā)起 GET 請(qǐng)求 response = requests.get('http://example.com/protected', headers=headers)
- params:
- 字典或類似字典的對(duì)象钱豁,用于將表單數(shù)據(jù)附加到URL的查詢字符串中(GET、POST請(qǐng)求)疯汁。
requests
庫(kù)會(huì)自動(dòng)對(duì)params進(jìn)行URL編碼牲尺,確保參數(shù)值中的空格、特殊字符等被正確處理幌蚊,并附加到 URL 上谤碳。params = { # 字典的值為列表 'key1': ['value1', 'value2'], # 如果需要為一個(gè)鍵傳遞多個(gè)值,可以在字典中使用列表 # 字典的值為字典列表 'key3': [{'subkey1': 'subvalue1'}, {'subkey2': 'subvalue2'}], # 字典的鍵值是元組 ('key4','key5'): ('subvalue4','subvalue5'), 'key6': 'value6' } response = requests.get('https://httpbin.org/get', params=params) # 查看響應(yīng)內(nèi)容 print(response.text) ''' 打印響應(yīng)對(duì)象的文本內(nèi)容url的值如下: "url": "https://httpbin.org/get?key1=value1&key1=value2&key3=subkey1&key3=subkey2 &('key4'%2C+'key5')=subvalue4&('key4'%2C+'key5')=subvalue5&key6=value6" '''
- data:
- 字典或類似字典的對(duì)象溢豆,用于表單數(shù)據(jù)的提交估蹄。(POST、PUT請(qǐng)求)
requests
庫(kù)會(huì)自動(dòng)設(shè)置Content-Type
為application/x-www-form-urlencoded
沫换。如果指定了headers中的Content-Type
為application/json
臭蚁,則data將被序列化為JSON格式。⑴ 使用表單數(shù)據(jù)發(fā)送POST請(qǐng)求
# 定義表單數(shù)據(jù) data = { 'key1': 'value1', 'key2': ['value2', 'value3'] } response_form = requests.post('https://httpbin.org/post', data=data)
⑵ 使用json數(shù)據(jù)發(fā)送POST請(qǐng)求
import json headers = {'Content-Type': 'application/json'} data = { 'key1': 'value1', 'key2': ['value2', 'value3'] } # 將字典轉(zhuǎn)換為JSON字符串(需要 import json) json_data = json.dumps(data) response_json = requests.post('https://httpbin.org/post', headers=headers, data=json_data)
⑶ 對(duì)于大文件讯赏,可以使用流式上傳文件以節(jié)省內(nèi)存:
with open('large_file.zip', 'rb') as file: response = requests.post('https://httpbin.org/post', data=file)
- json:
- 字典或類似字典的對(duì)象垮兑,用于發(fā)送JSON數(shù)據(jù)。(POST漱挎、PUT請(qǐng)求)
requests
庫(kù)會(huì)自動(dòng)設(shè)置Content-Type
為application/json
系枪。response = requests.post('https://httpbin.org/post', json={'key1': 'value1'})
- files:
- 字典
{'表單字段名': ('文件名', 文件對(duì)象)}
,用于上傳文件磕谅。(POST請(qǐng)求)
requests
庫(kù)會(huì)自動(dòng)設(shè)置Content-Type
為multipart/form-data
私爷,這是文件上傳的標(biāo)準(zhǔn)格式。- 鍵:是是表單字段名膊夹,相當(dāng)于HTML表單中的name屬性衬浑。
- 值:是一個(gè)元組。第一個(gè)元素是文件名(在服務(wù)器上保存的名稱)放刨,第二個(gè)元素是文件對(duì)象(可以使用
open()
函數(shù)打開(kāi)文件并獲取文件對(duì)象)工秩。為什么通常不建議省略文件名:
- 服務(wù)器端處理:服務(wù)器端的代碼通常依賴于文件名來(lái)保存上傳的文件。如果沒(méi)有提供文件名,服務(wù)器可能無(wú)法正確處理文件助币,或者會(huì)使用默認(rèn)的文件名浪听,這可能不是你想要的。
- 內(nèi)容識(shí)別:文件名可以提供關(guān)于文件內(nèi)容類型的線索眉菱,有助于服務(wù)器端正確處理文件(例如迹栓,根據(jù)文件擴(kuò)展名設(shè)置正確的 Content-Type)。
- 避免沖突:如果多個(gè)文件上傳到同一個(gè)服務(wù)器端路徑俭缓,明確的文件名可以避免命名沖突迈螟。
- 如果省略了文件名,服務(wù)器接收到的文件名將是文件對(duì)象的名稱尔崔,如report.xls答毫。
⑴ 直接在files字典中使用open函數(shù)打開(kāi)文件
files = { 'file': open('report.xls', 'rb'), 'photo': open('image.jpg', 'rb') } try: response = requests.post('https://httpbin.org/post', files=files) finally: # 無(wú)論請(qǐng)求是否成功或是否發(fā)生異常,文件對(duì)象都會(huì)被關(guān)閉季春。 # 沒(méi)有使用with語(yǔ)句洗搂,文件對(duì)象在上傳完成后需要手動(dòng)關(guān)閉,否則可能會(huì)導(dǎo)致文件泄露载弄。 for file in files.values(): file.close() # 確保每個(gè)文件都被關(guān)閉
⑵ 使用with語(yǔ)句來(lái)打開(kāi)文件
# with語(yǔ)句可以確保在代碼塊執(zhí)行完畢后耘拇,文件正確關(guān)閉,即使在上傳過(guò)程中發(fā)生異常也是如此宇攻。 with open('report.xls', 'rb') as f: # files字典的值是一個(gè)元組惫叛,其中第二個(gè)元素是文件對(duì)象f files = {'file': ('report.xls', f)} response = requests.post('https://httpbin.org/post', files=files)
- stream:
- 布爾值,用于流式下載逞刷。默認(rèn)值
False
嘉涌,立即下載整個(gè)響應(yīng)體數(shù)據(jù)加載到內(nèi)存中。
如果設(shè)置為True
夸浅,則響應(yīng)內(nèi)容不會(huì)被立即下載仑最,requests會(huì)提供一個(gè)可迭代的文件類對(duì)象,支持逐塊讀取響應(yīng)體帆喇。適用于處理大文件或流式數(shù)據(jù)警医,以減少內(nèi)存的使用。
注意:流式上傳坯钦,通常不需要特別設(shè)置stream參數(shù)预皇,通過(guò)將文件對(duì)象傳遞給data參數(shù)來(lái)實(shí)現(xiàn)。
流式下載文件:# 使用`stream=True`時(shí)婉刀,使用`with`語(yǔ)句確保在處理完響應(yīng)后關(guān)閉響應(yīng)對(duì)象吟温,以釋放底層的TCP連接。 with requests.get('https://httpbin.org/get', stream=True) as response: # 使用 iter_content 方法路星,逐塊處理響應(yīng)體 for chunk in response.iter_content(chunk_size=150): # 每次讀取150字節(jié) # 流式下載不會(huì)自動(dòng)解碼響應(yīng)內(nèi)容溯街。如果需要處理解碼后的文本诱桂,需要手動(dòng)解碼每個(gè)數(shù)據(jù)塊洋丐。 print("Chunk:", chunk) # 將字節(jié)數(shù)據(jù)解碼為字符串(假設(shè)響應(yīng)內(nèi)容是UTF-8編碼的文本) text = chunk.decode('utf-8', errors='ignore') # 使用忽略錯(cuò)誤的方式解碼 print("Text:", text, "\n") # 處理每一塊數(shù)據(jù)
with requests.get('https://example.com/largefile.zip', stream=True) as response: with open('localfile.zip', 'wb') as out_file: for chunk in response.iter_content(chunk_size=8192): out_file.write(chunk)
- timeout:
- 浮點(diǎn)數(shù)或元組呈昔,用于指定請(qǐng)求的超時(shí)時(shí)間(秒)。默認(rèn)無(wú)限期地等待友绝。
可使用try...except
塊來(lái)捕獲Timeout
異常堤尾,以便在請(qǐng)求超時(shí)時(shí)進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理。try: response = requests.get('http://example.com', timeout=5) # 整數(shù)迁客,5秒超時(shí) response = requests.get('http://example.com', timeout=0.5) # 浮點(diǎn)數(shù)郭宝,0.5秒超時(shí) # timeout是元組時(shí),用于指定連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間 (timeout_connect,timeout_read) 掷漱。 response = requests.get('http://example.com', timeout=(2, 5)) # 元組粘室,2秒連接超時(shí),5秒讀取超時(shí) except requests.exceptions.Timeout: print("請(qǐng)求超時(shí)")
- verify:
- 布爾值卜范,或到CA證書(shū)包的路徑衔统,用于控制是否驗(yàn)證服務(wù)器的SSL 證書(shū)。默認(rèn)值
True
海雪。
如果服務(wù)器證書(shū)驗(yàn)證失敗锦爵,requests
將拋出一個(gè)requests.exceptions.SSLError
異常。# 驗(yàn)證服務(wù)器SSL證書(shū) response = requests.get('https://example.com', verify=True) # 不驗(yàn)證服務(wù)器SSL證書(shū)(不推薦在生產(chǎn)環(huán)境中使用) response = requests.get('https://example.com', verify=False) # 使用自定義CA證書(shū)包驗(yàn)證服務(wù)器證書(shū) response = requests.get('https://example.com', verify='/path/to/cacert.pem')
- cert:
- 字符串或元組奥裸,用于傳遞客戶端證書(shū)和私鑰文件的路徑险掀。
通常,cert
和verify
參數(shù)一起使用湾宙,以確闭燎猓客戶端和服務(wù)器之間的通信是安全和加密的。# 只傳遞證書(shū)文件侠鳄,字符串:.pem格式的證書(shū)文件路徑 response = requests.get('https://example.com', cert='/path/to/cert.pem') # 傳遞證書(shū)文件和私鑰文件嗡害,元組:(.pem格式的證書(shū)文件路徑,.pem格式的私鑰文件路徑) response = requests.get('https://example.com', cert=('/path/to/cert.pem', '/path/to/key.pem'))
- allow_redirects:
- 布爾值畦攘,是否允許重定向霸妹,默認(rèn)值
True
允許重定向。
requests
默認(rèn)允許最多30次重定向知押,超出限制拋出requests.exceptions.TooManyRedirects
異常叹螟。⑴ 允許重定向
requests
會(huì)自動(dòng)跟隨重定向響應(yīng)(如301、302台盯、303罢绽、307、308狀態(tài)碼)直到最終的響應(yīng)静盅。response = requests.get('https://httpbin.org/redirect/1', allow_redirects=True) print("【url】", response.url) # 打印最終的URL # 設(shè)置allow_redirects=True良价,重定向歷史的第一個(gè)對(duì)象的請(qǐng)求URL即為原始請(qǐng)求 if response.history: print("【request.url】", response.history[0].request.url) # 打印原始請(qǐng)求的URL print("【text】", response.text) # 打印最終響應(yīng)的文本 print("【content】", response.content) # 打印最終響應(yīng)的原始二進(jìn)制內(nèi)容 print("【history】", response.history) # 打印重定向歷史 # 打印重定向歷史所有對(duì)象的請(qǐng)求URL和最終URL for redirect in response.history: print("【redirect.request.url】", redirect.request.url) print("【redirect.url】", redirect.url) print("【status_code】", response.status_code) # 打印最終響應(yīng)的狀態(tài)碼
⑵ 不允許重定向
requests
不自動(dòng)跟隨重定向寝殴,返回一個(gè)包含重定向請(qǐng)求信息的響應(yīng)對(duì)象。response = requests.get('https://httpbin.org/redirect/1', allow_redirects=False) print("【url】", response.url) # 打印最終的URL # 設(shè)置allow_redirects=False明垢,無(wú)重定向歷史蚣常,不會(huì)打印原始請(qǐng)求 if response.history: print("【request.url】", response.history[0].request.url) # 不會(huì)打印原始請(qǐng)求的URL print("【text】", response.text) # 打印最終響應(yīng)的文本 print("【content】", response.content) # 打印最終響應(yīng)的原始二進(jìn)制內(nèi)容 print("【history】", response.history) # 打印重定向歷史 print("【status_code】", response.status_code) # 打印最終響應(yīng)的狀態(tài)碼
- proxies:
- 字典,用于配置代理痊银。
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', } response = requests.get('http://example.com', proxies=proxies)
三抵蚊、 響應(yīng)對(duì)象(Response)
requests
請(qǐng)求返回的 response
對(duì)象包含了服務(wù)器響應(yīng)的所有信息:
-
response.status_code
:最終響應(yīng)的HTTP狀態(tài)碼。 -
response.text
:解碼后的文本內(nèi)容(Unicode字符串)溯革。 -
response.content
:最終響應(yīng)的原始字節(jié)序列(bytes對(duì)象)贞绳,多用于處理非文本響應(yīng)。 -
response.json()
:如果預(yù)期響應(yīng)是 JSON 格式致稀,可以使用該方法直接解析為 JSON 對(duì)象冈闭。 -
response.url
:實(shí)際請(qǐng)求的最終 URL(考慮了重定向)。 -
response.headers
:響應(yīng)頭抖单。 -
response.cookies
:服務(wù)器發(fā)送的 cookies萎攒。 -
response.history
:列表,包含所有重定向的響應(yīng)對(duì)象臭猜。
注:
1. 編碼和解碼:將Unicode字符串轉(zhuǎn)換為字節(jié)序列稱為編碼躺酒。將字節(jié)序列轉(zhuǎn)換回Unicode字符串稱為解碼。
2. Unicode字符串:表示文本數(shù)據(jù)蔑歌,包括但不限于拉丁字母羹应、漢字、阿拉伯字母次屠、梵文等园匹。
3. 字節(jié)序列:可以表示文本數(shù)據(jù),也可以表示二進(jìn)制數(shù)據(jù)劫灶,如圖片裸违、音頻、視頻文件等本昏。在Python中用bytes類型表示字節(jié)序列供汛。例如b'Hello, \xe4\xb8\x96\xe7\x95\x8c!'表示文本數(shù)據(jù)'Hello, 世界!'
# 文本數(shù)據(jù)(Unicode字符串)
text = "Hello, 世界!"
# 采用UTF-8編碼后的字節(jié)序列
b = text.encode('utf-8')
print("byte sequence:",b) # 輸出: b'Hello, \xe4\xb8\x96\xe7\x95\x8c!'
# 采用UTF-8解碼后的文本數(shù)據(jù)(Unicode字符串)
s = b.decode('utf-8')
print("Unicode string:",s) # 輸出:Hello, 世界!
四、異常處理(RequestException)
使用 requests
發(fā)起請(qǐng)求后涌穆,應(yīng)該首先檢查響應(yīng)的狀態(tài)碼以確定請(qǐng)求是否成功怔昨。這可能會(huì)遇到各種異常,如連接錯(cuò)誤宿稀、超時(shí)等趁舀。你可以使用 try-except 語(yǔ)句來(lái)捕獲這些異常:
def get_soup(url, headers):
"""獲取網(wǎng)頁(yè)內(nèi)容并返回BeautifulSoup對(duì)象"""
try:
# 確保URL以http開(kāi)頭
url = url.replace('https://', 'http://') if url.startswith('https://') else url
with requests.get(url, headers=headers, timeout=10, verify=False) as response:
response.raise_for_status()
return BeautifulSoup(response.content, "html.parser")
# 響應(yīng)的狀態(tài)碼不是 200 時(shí)拋出
except requests.exceptions.HTTPError as e:
print(f"HTTP error: {e.response.status_code} - {e}")
# 連接問(wèn)題時(shí)拋出
except requests.exceptions.ConnectionError:
print("Error connecting to the server.")
# 請(qǐng)求超時(shí)時(shí)拋出
except requests.exceptions.Timeout:
print("Request timed out.")
# 所有請(qǐng)求相關(guān)的異常的基類
except requests.exceptions.RequestException as e:
print(f"Request error: {e}")
return None
五、會(huì)話和持久連接(Session)
Session
對(duì)象允許你通過(guò)一個(gè)持久的連接來(lái)發(fā)送多個(gè)請(qǐng)求祝沸,這可以提高性能矮烹,因?yàn)樗鼫p少了重復(fù)連接服務(wù)器的開(kāi)銷越庇。使用 requests.Session
可以在多個(gè)請(qǐng)求之間保持某些參數(shù),如 cookies:
with requests.Session() as session:
session.headers.update({'x-test': 'true'})
response = session.get('https://httpbin.org/get', params={'key': 'value'})
以下是 requests.Session()
的詳細(xì)說(shuō)明和用法:
基本用法
創(chuàng)建一個(gè) Session
對(duì)象:
import requests
session = requests.Session()
使用 Session
對(duì)象發(fā)起請(qǐng)求:
response = session.get('http://example.com')
會(huì)話的用途
-
保持參數(shù):
Session
對(duì)象允許你設(shè)置一些參數(shù)一次奉狈,然后對(duì)多個(gè)請(qǐng)求重用這些參數(shù)卤唉。 -
保持 Cookies:
Session
會(huì)自動(dòng)處理 Cookies,保持用戶會(huì)話嘹吨。 -
連接池:
Session
使用連接池來(lái)管理持久連接搬味,這可以顯著提高性能境氢。 - 會(huì)話頭部:可以為會(huì)話設(shè)置自定義頭部蟀拷,這些頭部會(huì)自動(dòng)應(yīng)用于會(huì)話中的所有請(qǐng)求。
常用方法和屬性
-
session.headers
:設(shè)置會(huì)話級(jí)別的請(qǐng)求頭部萍聊。 -
session.cookies
:管理會(huì)話中的 Cookies问芬。 -
session.auth
:設(shè)置會(huì)話級(jí)別的 HTTP 認(rèn)證信息。 -
session.proxies
:設(shè)置會(huì)話級(jí)別的代理寿桨。 -
session.hooks
:注冊(cè)會(huì)話級(jí)別的請(qǐng)求和響應(yīng)鉤子此衅。 -
session.get(url, **kwargs)
:發(fā)起 GET 請(qǐng)求。 -
session.post(url, data=None, **kwargs)
:發(fā)起 POST 請(qǐng)求亭螟。 -
session.put(url, data=None, **kwargs)
:發(fā)起 PUT 請(qǐng)求挡鞍。 -
session.delete(url, **kwargs)
:發(fā)起 DELETE 請(qǐng)求。 -
session.request(method, url, **kwargs)
:發(fā)起任意類型的請(qǐng)求预烙。 -
session.close()
:關(guān)閉會(huì)話墨微,釋放資源。
示例
使用會(huì)話發(fā)起多個(gè)請(qǐng)求:
session = requests.Session()
session.headers.update({'User-Agent': 'my-app/0.0.1'})
response1 = session.get('http://example.com/get1')
response2 = session.get('http://example.com/get2')
# 會(huì)話中的請(qǐng)求將共享相同的參數(shù)扁掸,如 headers 和 cookies
使用會(huì)話進(jìn)行文件上傳:
with open('report.xls', 'rb') as f:
files = {'file': f}
session.post('http://example.com/upload', files=files)
使用會(huì)話進(jìn)行持久連接:
session = requests.Session()
session.mount('http://', requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10))
response = session.get('http://example.com')
在這個(gè)例子中翘县,我們使用 mount
方法來(lái)掛載一個(gè) HTTP 適配器,該適配器使用連接池來(lái)管理持久連接谴分。
注意事項(xiàng)
- 使用
Session
對(duì)象時(shí)锈麸,確保在完成所有請(qǐng)求后調(diào)用session.close()
來(lái)關(guān)閉會(huì)話,釋放資源牺蹄。 -
Session
對(duì)象是線程安全的忘伞,可以在多線程環(huán)境中使用。
requests.Session()
提供了一個(gè)高效的方式來(lái)管理多個(gè) HTTP 請(qǐng)求沙兰,特別是在需要保持狀態(tài)(如 Cookies)或重用參數(shù)的情況下氓奈。通過(guò)使用會(huì)話,你可以簡(jiǎn)化代碼并提高應(yīng)用程序的性能僧凰。