Requests 高級(jí)用法

1. 文件上傳

使用 post 請(qǐng)求提交數(shù)據(jù)

import requests
# 文件上傳 post請(qǐng)求
file = {'file': open('./uploadfile.png', 'rb')}
print("開始請(qǐng)求")
res = requests.post('http://httpbin.org/post', files=file)
res = res.text
print(res)

2.Cookies

  • 獲取 cookie

    import requests
    res = requests.get('http://www.baidu.com')
    # 調(diào)用請(qǐng)求響應(yīng)的cookies屬性獲取cookie
    cookies = res.cookies
    for key,values in cookies.items():
      print(key,':',values)
    
  • 設(shè)置 cookie 方法一:將 cookie 加入請(qǐng)求頭 headers 中。

    import requests
    # 方法一:cookie加入到headers請(qǐng)求頭中
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
      'Cookie': 'd_c0="AAAC8BK13wyPTmULuvtm0wkjbW5ZyeFirPE=|1513951174"; _zap=87e9c9e3-5dbd-418b-8ebc-230ab091ecb5; __DAYU_PP=ef6JrVABfZUAjb7bBFuv217bd0126e8c; _ga=GA1.2.661525257.1520666422; ……capsion_ticket="2|1:0|10:1528862525|14:capsion_ticket|44:NDI0ZmI5MDliMjJhNDE4YzlkMTUzY2IwMTA3Njg5YTE=|8658014fd601bdcc209fe2b13d74da5ecd597135f8709b7727d3c7d2a4f97612"',
      'Host': 'www.zhihu.com'
    }
    # 注意此處請(qǐng)求url是https協(xié)議。
    res = requests.get('https://www.zhihu.com', headers=headers)
    print(res.text)
    
    
  • 設(shè)置 cookie 方法二:構(gòu)造 RequestCookieJar 。

    import requests
    cookies = 'd_c0="AAAC8BK13wyPTmULuvtm0wkjbW5ZyeFirPE=|1513951174"; _zap=87e9c9e3-5dbd-418b-8ebc-230ab091ecb5; __DAYU_PP=ef6JrVABfZUAjb7bBFuv217bd0126e8c; _ga=GA1.2.661525257.1520666422; l_cap_id="ODZmNzc0NTIwZDU3NGMwNTg3ZTExMjNmZWVmZTJiZmM=|1527817448|09c4b1d56078f428986cabddc6a314695ce7a463"; capsion_ticket="2|1:0|10:1528862525|14:capsion_ticket|44:NDI0ZmI5MDliMjJhNDE4YzlkMTUzY2IwMTA3Njg5YTE=|8658014fd601bdcc209fe2b13d74da5ecd597135f8709b7727d3c7d2a4f97612"'
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
      'Host': 'www.zhihu.com'
    }
    
    jar = requests.cookies.RequestsCookieJar()
    
    for cookie in cookies.split(';'):
      key, value = cookie.split('=', 1)
      jar.set(key,value)
    
    res = requests.get('https://www.zhihu.com', cookies=jar, headers=headers)
    print(res.text)
    

3.會(huì)話保持

使用Session對(duì)象,維護(hù)會(huì)話。

import requests
# 會(huì)話保持:不使用每次都傳入cookie的方式
# 設(shè)置cookie
requests.get('http://httpbin.org/cookies/set/number/123456789')
# 獲取網(wǎng)站cookie
res = requests.get('http://httpbin.org/cookies')
print(res.text)

## 上面的請(qǐng)求會(huì)話狀態(tài)是不保存的(只是為了對(duì)比),下面的是正確用法 

# 設(shè)置 Session 對(duì)象, 作用是維持同一個(gè)會(huì)話
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
res = s.get('http://httpbin.org/cookies')
print(res.text)

4. SSL證書驗(yàn)證

  • requests 提供了證書驗(yàn)證的功能,可以使用 verify 參數(shù)(布爾值)去控制是否檢查證書。
import requests
# # SSL證書驗(yàn)證
# 請(qǐng)求時(shí)帶入 verify 關(guān)鍵字,值為False。表示不驗(yàn)證證書
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

# 不過上面的請(qǐng)求會(huì)有如下警告,建議指定證書
# InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warningsInsecureRequestWarning)

對(duì)于上述警告解決方法:

  • 方案一:設(shè)置忽略警告的方式屏蔽這個(gè)警告

    import requests
    from requests.packages import urllib3
    
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)
    
  • 方案二:使用 logging模塊 捕獲警告到日志的方式忽略警告

    import logging
    import requests
    logging.captureWarnings(True)
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)
    
  • 方案三:指定本地證書用作客戶端證書,本地私有證書的 key 必須是解密狀態(tài),加密狀態(tài)的key是不支持的

    import requests
    response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
    print(response.status_code)
    

5. 代理設(shè)置

import requests

proxies = {
    'http': 'http://1.12.32.1:2123',
    'https': 'http:/1.12.32.1:2123'
}

response = requests.get('http://www.baidu.com/s?wd="ip"', proxies=proxies)
print(response.text)

6. requests.codes.ok

根據(jù)請(qǐng)求的響應(yīng)碼,執(zhí)行響應(yīng)的代碼塊

import requests

# 請(qǐng)求失敗地址
res = requests.get('http://www.itdecent.cn/u/31dsdfb6d')
# 請(qǐng)求成功地址
# res = requests.get('http://www.baidu.com')

if res.status_code == requests.codes.ok:
    print('請(qǐng)求成功')
    # 執(zhí)行代碼塊
else:
    print('請(qǐng)求失敗')
    # 執(zhí)行代碼塊

7.超時(shí)設(shè)置

因網(wǎng)絡(luò)問題,可能導(dǎo)致某些請(qǐng)求會(huì)一直等待下去。故需要設(shè)置超時(shí)

timeout 參數(shù)值有兩種型式:

  • time : 整型,表示連接和讀取這兩者操作的 timeout 總和

  • (connect, read) 表示:連接超時(shí)時(shí)間和讀取超時(shí)時(shí)間,默認(rèn)值為None。

#如果你制訂了一個(gè)單一的值作為 timeout,如下所示:

r = requests.get('https://github.com', timeout=5)
#這一 timeout 值將會(huì)用作 connect 和 read 二者的 timeout。如果要分別制定,就傳入一個(gè)元組:

r = requests.get('https://github.com', timeout=(3.05, 27))
#如果遠(yuǎn)端服務(wù)器很慢,你可以讓 Request 永遠(yuǎn)等待,傳入一個(gè) None 作為 timeout 值,然后就沖咖啡去吧。

r = requests.get('https://github.com', timeout=None)

官方文檔:http://docs.python-requests.org/zh_CN/latest/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 昨天,我們更多的討論了request的基礎(chǔ)API,讓我們對(duì)它有了基礎(chǔ)的認(rèn)知。學(xué)會(huì)上一課程,我們已經(jīng)能寫點(diǎn)基本的爬蟲...
    阿爾卑斯山上的小灰兔閱讀 12,542評(píng)論 1 8
  • 我一直標(biāo)榜自己是個(gè)知識(shí)分子,是個(gè)讀過書的人,心高氣傲,而又碌碌無為。總覺得公務(wù)員的身份才能跟我匹配,總是認(rèn)為做生意...
    馬策先生閱讀 130評(píng)論 0 0
  • 昨晚夢(mèng)到你 原來心里還是那么在乎 離開一段時(shí)間 會(huì)突然懷疑自己是否太過于較真 但是玩笑還是那么開不起啊 不后悔 就這樣
    小野家出品閱讀 160評(píng)論 0 0
  • 一個(gè)腦癱、身體不便的農(nóng)民,出了一本詩集,大家都很關(guān)注,最近還在四處出席訪談活動(dòng),在梁文道的節(jié)目都出現(xiàn)了——在沒有讀...
    趙玥昕閱讀 8,511評(píng)論 0 6

友情鏈接更多精彩內(nèi)容