【Python基礎(chǔ)】requests庫(kù)

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)求:

  1. headers: 字典摇幻,用于自定義HTTP請(qǐng)求頭。
  2. cookies: 字典挥萌,或 RequestsCookieJar 對(duì)象绰姻,包含 cookies。
  3. auth: 元組引瀑,用于HTTP認(rèn)證的憑據(jù)狂芋。第一個(gè)元素是用戶名,第二個(gè)元素是密碼憨栽。
  4. params: 字典帜矾,用于將表單數(shù)據(jù)附加到URL的查詢字符串中(GET、POST請(qǐng)求)屑柔。
  5. data: 字典或類似字典的對(duì)象屡萤,用于表單數(shù)據(jù)的提交。(POST掸宛、PUT請(qǐng)求)
  6. json: 字典或類似字典的對(duì)象死陆,用于發(fā)送JSON數(shù)據(jù)。(POST唧瘾、PUT請(qǐng)求)
  7. files: 字典{'表單字段名': ('文件名', 文件對(duì)象)}措译,用于上傳文件迫像。(POST請(qǐng)求)
  8. stream: 布爾值,用于流式下載瞳遍。默認(rèn)值False闻妓,為True逐塊讀取響應(yīng)體減少內(nèi)存使用。
  9. timeout: 浮點(diǎn)數(shù)或元組掠械,用于指定請(qǐng)求的超時(shí)時(shí)間(秒)由缆。默認(rèn)無(wú)限期地等待。
  10. verify: 布爾值猾蒂,或到CA證書(shū)包的路徑均唉。默認(rèn)值True,為False不驗(yàn)證服務(wù)器SSL證書(shū)肚菠。
  11. cert: 字符串或元組舔箭,用于傳遞客戶端證書(shū)文件的路徑,或者證書(shū)和私鑰文件的路徑蚊逢。
  12. allow_redirects: 布爾值层扶,是否允許重定向。默認(rèn)為True允許重定向烙荷。
  13. 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ù)示例

  1. headers:
  • 字典,用于自定義HTTP請(qǐng)求頭惰许。
    headers = {'User-Agent': 'Mozilla/5.0 (compatible; YourBot/0.1)'}
    response = requests.get('http://example.com', headers=headers)
    
  1. cookies:
  • 字典席覆,或 RequestsCookieJar 對(duì)象,包含 cookies汹买。
    cookies = {'session_token': '123456789'}
    response = requests.get('http://example.com', cookies=cookies)
    
  1. 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)
    
  1. 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"
    '''
    
  1. data:
  • 字典或類似字典的對(duì)象溢豆,用于表單數(shù)據(jù)的提交估蹄。(POST、PUT請(qǐng)求)
    requests庫(kù)會(huì)自動(dòng)設(shè)置Content-Typeapplication/x-www-form-urlencoded沫换。如果指定了headers中的Content-Typeapplication/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)
    
  1. json:
  • 字典或類似字典的對(duì)象垮兑,用于發(fā)送JSON數(shù)據(jù)。(POST漱挎、PUT請(qǐng)求)
    requests庫(kù)會(huì)自動(dòng)設(shè)置 Content-Typeapplication/json系枪。
    response = requests.post('https://httpbin.org/post', json={'key1': 'value1'})
    
  1. files:
  • 字典{'表單字段名': ('文件名', 文件對(duì)象)},用于上傳文件磕谅。(POST請(qǐng)求)
    requests庫(kù)會(huì)自動(dòng)設(shè)置Content-Typemultipart/form-data私爷,這是文件上傳的標(biāo)準(zhǔn)格式。
    • 鍵:是是表單字段名膊夹,相當(dāng)于HTML表單中的name屬性衬浑。
    • 值:是一個(gè)元組。第一個(gè)元素是文件名(在服務(wù)器上保存的名稱)放刨,第二個(gè)元素是文件對(duì)象(可以使用open()函數(shù)打開(kāi)文件并獲取文件對(duì)象)工秩。
      為什么通常不建議省略文件名:
      1. 服務(wù)器端處理:服務(wù)器端的代碼通常依賴于文件名來(lái)保存上傳的文件。如果沒(méi)有提供文件名,服務(wù)器可能無(wú)法正確處理文件助币,或者會(huì)使用默認(rèn)的文件名浪听,這可能不是你想要的。
      2. 內(nèi)容識(shí)別:文件名可以提供關(guān)于文件內(nèi)容類型的線索眉菱,有助于服務(wù)器端正確處理文件(例如迹栓,根據(jù)文件擴(kuò)展名設(shè)置正確的 Content-Type)。
      3. 避免沖突:如果多個(gè)文件上傳到同一個(gè)服務(wù)器端路徑俭缓,明確的文件名可以避免命名沖突迈螟。
      4. 如果省略了文件名,服務(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)
    
  1. 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)
    
  1. 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í)")
    
  1. 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')
    
  1. cert:
  • 字符串或元組奥裸,用于傳遞客戶端證書(shū)和私鑰文件的路徑险掀。
    通常,certverify參數(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'))
    
  1. 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)碼
    
  1. 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ì)話的用途

  1. 保持參數(shù)Session 對(duì)象允許你設(shè)置一些參數(shù)一次奉狈,然后對(duì)多個(gè)請(qǐng)求重用這些參數(shù)卤唉。
  2. 保持 CookiesSession 會(huì)自動(dòng)處理 Cookies,保持用戶會(huì)話嘹吨。
  3. 連接池Session 使用連接池來(lái)管理持久連接搬味,這可以顯著提高性能境氢。
  4. 會(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)用程序的性能僧凰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末探颈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子训措,更是在濱河造成了極大的恐慌伪节,老刑警劉巖光羞,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怀大,居然都是意外死亡纱兑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)化借,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)潜慎,“玉大人,你說(shuō)我怎么就攤上這事蓖康☆盱牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蒜焊,是天一觀的道長(zhǎng)倒信。 經(jīng)常有香客問(wèn)我,道長(zhǎng)泳梆,這世上最難降的妖魔是什么鳖悠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮优妙,結(jié)果婚禮上乘综,老公的妹妹穿的比我還像新娘。我一直安慰自己套硼,他們只是感情好卡辰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著熟菲,像睡著了一般看政。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抄罕,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天允蚣,我揣著相機(jī)與錄音,去河邊找鬼呆贿。 笑死嚷兔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的做入。 我是一名探鬼主播冒晰,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竟块!你這毒婦竟也來(lái)了壶运?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浪秘,失蹤者是張志新(化名)和其女友劉穎蒋情,沒(méi)想到半個(gè)月后埠况,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棵癣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年辕翰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈谊。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喜命,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出河劝,到底是詐尸還是另有隱情壁榕,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布丧裁,位于F島的核電站护桦,受9級(jí)特大地震影響含衔,放射性物質(zhì)發(fā)生泄漏煎娇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一贪染、第九天 我趴在偏房一處隱蔽的房頂上張望缓呛。 院中可真熱鬧,春花似錦杭隙、人聲如沸哟绊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)票髓。三九已至,卻和暖如春铣耘,著一層夾襖步出監(jiān)牢的瞬間洽沟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工蜗细, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裆操,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓炉媒,卻偏偏與公主長(zhǎng)得像踪区,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吊骤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容