requests庫(kù)發(fā)送http請(qǐng)求的示例代碼
概述
requests 是一個(gè) Python 第三方庫(kù),用于發(fā)送 HTTP 請(qǐng)求。它提供了一種簡(jiǎn)單和方便的方法來(lái)與 Web 服務(wù)進(jìn)行交互,如獲取網(wǎng)頁(yè)內(nèi)容、發(fā)送數(shù)據(jù)、處理 Cookie 等。
- requests 是 用 python 語(yǔ)言編寫的,比 urllib2 模塊更簡(jiǎn)潔
- requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會(huì)話,支持文件上傳,支持自動(dòng)響應(yīng)內(nèi)容的編碼,支持國(guó)際化的URL 和 POST 數(shù)據(jù)自動(dòng)編碼。
- 在 python 內(nèi)置模塊的基礎(chǔ)上進(jìn)行了高度的封裝,從而使得 python 進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),變得人性化,使用 Requests 可以輕而易舉的完成瀏覽器可有的任何操作。
- requests 會(huì)自動(dòng)實(shí)現(xiàn)持久連接 keep-alive
requests常用API
常用方法
- request() :構(gòu)造一個(gè)請(qǐng)求,支持 GET、POST、PUT、DELETE 等方式,返回一個(gè) Response 對(duì)象
第一個(gè)參數(shù)默認(rèn)為 method,第二個(gè)參數(shù)默認(rèn)為 url
- get() :發(fā)送 Get 請(qǐng)求,返回一個(gè) Response 對(duì)象
第一個(gè)參數(shù)均默認(rèn)為 url
# 發(fā)送GET請(qǐng)求并獲取響應(yīng)內(nèi)容
response = requests.get("https://www.example.com")
# 發(fā)送帶參數(shù)的GET請(qǐng)求。字典傳遞參數(shù),如果值為None的鍵不會(huì)被添加到url中
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get("https://www.example.com", params=params)
- post() :發(fā)送 Post 請(qǐng)求,返回一個(gè) Response 對(duì)象
第一個(gè)參數(shù)均默認(rèn)為 url
import requests
import json
# 發(fā)送POST請(qǐng)求并傳遞數(shù)據(jù)
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("https://www.example.com", data=data)
# 發(fā)送JSON數(shù)據(jù)
headers = {'Content-Type': 'application/json'}
response = requests.post("https://www.example.com", data=json.dumps(data), headers=headers)
- Session() :獲取會(huì)話對(duì)象。能夠跨請(qǐng)求保持某些參數(shù)
requests.get() 或 requests.post() 等都是一次性請(qǐng)求,如果需要傳參 cookies 或 headers,則每次請(qǐng)求都需要傳參。
如果使用 session 來(lái)發(fā)起請(qǐng)求,session 實(shí)例在請(qǐng)求了一個(gè)網(wǎng)站后,對(duì)方服務(wù)器設(shè)置在本地的 cookie 會(huì)自動(dòng)保存在 session 對(duì)象中,下一次再使用 session 請(qǐng)求對(duì)方服務(wù)器的時(shí)候,會(huì)直接帶上前一次的 cookie,從而實(shí)現(xiàn)回話保持。
session = requests.Session() # cookies或者session或者token保存于session對(duì)象中
session.auth = ('auth','passwd')
session.headers = {'key':'value'}
response = session.get('url')
方法常用參數(shù)
- url :請(qǐng)求地址。發(fā)送請(qǐng)求方法的第一個(gè)參數(shù)均默認(rèn)為 url
- data :設(shè)置請(qǐng)求體,格式默認(rèn)為字典
- params:設(shè)置查詢參數(shù)字典
- headers:設(shè)置請(qǐng)求體,格式為字典
- timeout :設(shè)置秒數(shù)超時(shí),僅對(duì)于連接有效
一旦超過(guò)這個(gè)時(shí)間還沒獲得響應(yīng)內(nèi)容,就會(huì)提示錯(cuò)誤(需要異常處理)
try:
res = requests.get(url = 'url',timeout=1)
except exceptions.Timeout as e:
print(e)
except exceptions.HTTPError as e:
print(e)- cookies :設(shè)置 cookies
- proxies :設(shè)置訪問代理。通過(guò)代理可設(shè)置抓包
proxies = requests.get('url', proxies={'http':'[協(xié)議:]ip1:端口','https':'[協(xié)議:]ip2:端口'})
# 如果代理需要用戶名和密碼,則需要這樣:
proxies = {"http": "http://user:password@ip:端口", }- files :設(shè)置文件發(fā)送
files = {'file': open('report.xls', 'rb')}
#files = {'file': ('report.jpg', open('report.xls', 'rb'))} # 顯式的設(shè)置文件名
r = requests.post('http://m.ctrip.com', files=files)- auth :設(shè)置身份驗(yàn)證
import requests
from requests.auth import HTTPBasicAuth
resp = requests.get('url', auth=HTTPBasicAuth('user', 'passwd'))
#resp = requests.get('url', auth=('user', 'passwd')) # 簡(jiǎn)寫
#resp = requests.get(URL, auth=HTTPDigestAuth('user', 'pass') # 摘要式身份認(rèn)證requests.Response常用API
常用屬性:
- encoding :獲取當(dāng)前的編碼
- encoding = ‘utf-8’ :設(shè)置編碼
- text :以 encoding 的編碼解析返回內(nèi)容。字符串方式的響應(yīng)體,會(huì)自動(dòng)根據(jù)響應(yīng)頭部的字符編碼進(jìn)行解碼。
- content :以字節(jié)形式(二進(jìn)制)返回。字節(jié)方式的響應(yīng)體,會(huì)自動(dòng)解碼 gzip 和 deflate 壓縮。
- headers :以字典對(duì)象存儲(chǔ)服務(wù)器響應(yīng)頭,但是這個(gè)字典比較特殊,字典鍵不區(qū)分大小寫,若鍵不存在則返回 None
- status_code :響應(yīng)狀態(tài)碼
- raw :返回原始響應(yīng)體,也就是 urllib 的 response 對(duì)象,使用 response .raw.read()
- ok :布爾值,查看 http 請(qǐng)求是否成功(狀態(tài)碼:200)
- cookies :cookie 信息
- history :返回重定向信息
注:可以在請(qǐng)求時(shí)加上 allow_redirects = false 阻止重定向
特殊方法:
- json() :Requests 中內(nèi)置的 JSON 解碼器,以 json 形式返回
前提返回的內(nèi)容確保是 json 格式的,不然解析出錯(cuò)會(huì)拋異常
- raise_for_status() :失敗請(qǐng)求(非 200 響應(yīng))拋出異常
發(fā)送https請(qǐng)求并忽略SSL證書校驗(yàn)
https和SSL證書介紹
HTTPS(HyperText Transfer Protocol Secure)是一種安全的超文本傳輸協(xié)議,它結(jié)合了 HTTP 協(xié)議和 SSL/TLS 協(xié)議。HTTPS 使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)協(xié)議來(lái)加密和保護(hù)通信數(shù)據(jù)的傳輸。SSL 和 TLS 用于建立加密連接,保護(hù)數(shù)據(jù)傳輸?shù)陌踩院屯暾浴?/p>
HTTPS 和 SSL 證書的關(guān)系及工作流程:
- 建立安全連接: 客戶端發(fā)起 HTTPS 請(qǐng)求時(shí),客戶端和服務(wù)器首先建立一個(gè)安全連接。
- 握手過(guò)程: 這個(gè)連接的建立通過(guò) SSL/TLS 握手過(guò)程實(shí)現(xiàn)。在這個(gè)過(guò)程中,服務(wù)器將自己的 SSL 證書發(fā)送給客戶端。
- 證書驗(yàn)證: 客戶端收到服務(wù)器的 SSL 證書后,會(huì)驗(yàn)證證書的有效性,包括驗(yàn)證證書的簽名是否有效,是否過(guò)期,是否與請(qǐng)求的域名匹配等。
- 密鑰交換: 客戶端和服務(wù)器通過(guò) SSL/TLS 握手過(guò)程協(xié)商加密算法和密鑰,以建立一個(gè)加密通道。
- 加密通信: 一旦加密通道建立,客戶端和服務(wù)器之間的數(shù)據(jù)傳輸將通過(guò)選定的加密算法加密,確保通信的安全性。
SSL 證書在這個(gè)過(guò)程中起到關(guān)鍵作用,它用于驗(yàn)證服務(wù)器的身份,并確定加密通道的加密參數(shù)。服務(wù)器的 SSL 證書由受信任的第三方機(jī)構(gòu)(CA)簽發(fā),客戶端通過(guò)信任這些 CA 來(lái)驗(yàn)證服務(wù)器的身份。
要實(shí)現(xiàn) HTTPS 通信,需要向一個(gè)受信任的 CA 申請(qǐng) SSL 證書,并將其安裝到服務(wù)器上。當(dāng)客戶端通過(guò) HTTPS 請(qǐng)求網(wǎng)站時(shí),它們會(huì)驗(yàn)證服務(wù)器的 SSL 證書,并確保連接是安全的。
requests發(fā)送https請(qǐng)求并忽略SSL證書校驗(yàn)
在某些情況下,可能需要在使用 requests 發(fā)送 HTTPS 請(qǐng)求時(shí)忽略 SSL 證書驗(yàn)證,例如在測(cè)試環(huán)境或自簽名證書的情況下。
可以通過(guò)設(shè)置 verify 參數(shù)為 False 來(lái)實(shí)現(xiàn)忽略 SSL 證書驗(yàn)證。
注意:
1、即使在使用 requests 發(fā)送請(qǐng)求時(shí)將 verify 參數(shù)設(shè)置為 False,仍然會(huì)進(jìn)行 SSL/TLS 握手。
verify=False 只是告訴 requests 跳過(guò) SSL 證書驗(yàn)證,而不會(huì)禁止 SSL/TLS 握手過(guò)程。
2、SSL/TLS 握手是建立安全連接的關(guān)鍵步驟,它用于協(xié)商加密算法、密鑰交換和建立加密通道。
即使不驗(yàn)證服務(wù)器的 SSL 證書(使用 verify=False),仍然需要進(jìn)行 SSL/TLS 握手以確保通信的安全性。
3、使用 verify=False 時(shí),SSL/TLS 握手過(guò)程會(huì)進(jìn)行,但在握手過(guò)程中會(huì)跳過(guò)對(duì)服務(wù)器 SSL 證書的驗(yàn)證。這意味著即使服務(wù)器的證書無(wú)效或過(guò)期,握手也會(huì)繼續(xù)進(jìn)行,但連接可能不安全,因?yàn)闊o(wú)法保證正在連接到正確的服務(wù)器。
4、如果想完全跳過(guò) SSL/TLS 握手,而不建立安全連接,可以考慮直接使用普通的 HTTP 連接,而不是 HTTPS。
但這樣會(huì)使通信不安全,不推薦在生產(chǎn)環(huán)境中使用。如果需要安全連接,建議使用合法有效的 SSL 證書,并允許 SSL/TLS 握手過(guò)程來(lái)確保連接的安全性。
[SSL: DH_KEY_TOO_SMALL] dh key too small 報(bào)錯(cuò):
SSL/TLS 握手過(guò)程中可能會(huì)出現(xiàn) DH(即 Diffie-Hellman,密鑰交換協(xié)議/算法)密鑰長(zhǎng)度過(guò)小的問題。這通常是由于使用過(guò)小的 DH 密鑰長(zhǎng)度或不安全的DH密鑰交換算法導(dǎo)致的。
在新的 SSL/TLS 標(biāo)準(zhǔn)中,強(qiáng)制要求使用安全的密鑰長(zhǎng)度和加密算法,以確保通信的安全性。一些舊的、不安全的加密算法或密鑰長(zhǎng)度會(huì)被標(biāo)記為不安全,因此會(huì)導(dǎo)致類似的錯(cuò)誤。
**解決方案:**在請(qǐng)求中設(shè)置合適的 ciphers 來(lái)排除 DH 密鑰長(zhǎng)度過(guò)小的加密套件。但這并不是安全的解決辦法,因?yàn)樗鼤?huì)降低通信的安全性。
方式1:使用 ssl_default_context 指定允許的加密算法
import requests import ssl url = 'https://example.com' # 替換為你要請(qǐng)求的 HTTPS URL # 禁用 SSL 校驗(yàn) ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE # 指定允許的加密算法 ciphers = 'HIGH:!DH:!aNULL' ssl_context.set_ciphers(ciphers) # 忽略警告 urllib3.disable_warnings() # 發(fā)送 HTTPS 請(qǐng)求 response = requests.get(url, verify=ssl_context)
方式2:使用 requests.packages.urllib3 包指定允許的加密算法
可以使用 requests.packages.urllib3 包來(lái)處理與 SSL 相關(guān)的功能。在這種情況下,可以使用 DEFAULT_CIPHERS 常量來(lái)設(shè)置默認(rèn)的加密算法。
注意:requests.packages.urllib3 靜態(tài)編譯可能會(huì)顯示找不到,忽略即可,因?yàn)槠淇赡苁莿?dòng)態(tài)加載的
import requests url = 'https://example.com' # 替換為你要請(qǐng)求的 HTTPS URL # 設(shè)置默認(rèn)加密算法為 HIGH:!DH:!aNULL。 requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL' # 忽略警告 requests.packages.urllib3.disable_warnings() # 發(fā)送 HTTPS 請(qǐng)求 response = requests.get(url, verify=False)
到此這篇關(guān)于requests庫(kù)發(fā)送http請(qǐng)求的示例代碼的文章就介紹到這了,更多相關(guān)requests發(fā)送http請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python入門while循環(huán)語(yǔ)句理解學(xué)習(xí)
這篇文章主要介紹了python入門while循環(huán)語(yǔ)句理解學(xué)習(xí),文中附含詳細(xì)圖文示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
基于python實(shí)現(xiàn)數(shù)組格式參數(shù)加密計(jì)算
這篇文章主要介紹了基于python實(shí)現(xiàn)數(shù)組格式參數(shù)加密計(jì)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python實(shí)現(xiàn)字符型圖片驗(yàn)證碼識(shí)別完整過(guò)程詳解
這篇文章主要介紹了Python實(shí)現(xiàn)字符型圖片驗(yàn)證碼識(shí)別完整過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Python實(shí)現(xiàn)自動(dòng)玩貪吃蛇程序
這篇文章主要介紹了通過(guò)Python實(shí)現(xiàn)的簡(jiǎn)易的自動(dòng)玩貪吃蛇游戲的小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)一學(xué)2022-01-01
基于pandas將類別屬性轉(zhuǎn)化為數(shù)值屬性的方法
今天小編就為大家分享一篇基于pandas將類別屬性轉(zhuǎn)化為數(shù)值屬性的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python技巧之實(shí)現(xiàn)批量統(tǒng)一圖片格式和尺寸
大家在工作的時(shí)候基本都會(huì)接觸到很多的圖片,有時(shí)為了不同的工作需求需要修改圖片的尺寸或者大小。本文為大家整理了Python批量轉(zhuǎn)換圖片格式和統(tǒng)一圖片尺寸,希望對(duì)大家有所幫助2023-05-05
使用PM2+nginx部署python項(xiàng)目的方法示例
這篇文章主要介紹了使用PM2+nginx部署python項(xiàng)目的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析
這篇文章主要介紹了Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04
python中argparse模塊及action='store_true'詳解
argparse?是一個(gè)用來(lái)解析命令行參數(shù)的?Python?庫(kù),它是?Python?標(biāo)準(zhǔn)庫(kù)的一部分,這篇文章主要介紹了python中argparse模塊及action=‘store_true‘詳解,需要的朋友可以參考下2023-02-02

