requests庫發(fā)送http請求的示例代碼
概述
requests 是一個 Python 第三方庫,用于發(fā)送 HTTP 請求。它提供了一種簡單和方便的方法來與 Web 服務(wù)進(jìn)行交互,如獲取網(wǎng)頁內(nèi)容、發(fā)送數(shù)據(jù)、處理 Cookie 等。
- requests 是 用 python 語言編寫的,比 urllib2 模塊更簡潔
- requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會話,支持文件上傳,支持自動響應(yīng)內(nèi)容的編碼,支持國際化的URL 和 POST 數(shù)據(jù)自動編碼。
- 在 python 內(nèi)置模塊的基礎(chǔ)上進(jìn)行了高度的封裝,從而使得 python 進(jìn)行網(wǎng)絡(luò)請求時,變得人性化,使用 Requests 可以輕而易舉的完成瀏覽器可有的任何操作。
- requests 會自動實現(xiàn)持久連接 keep-alive
requests常用API
常用方法
- request() :構(gòu)造一個請求,支持 GET、POST、PUT、DELETE 等方式,返回一個 Response 對象
第一個參數(shù)默認(rèn)為 method,第二個參數(shù)默認(rèn)為 url
- get() :發(fā)送 Get 請求,返回一個 Response 對象
第一個參數(shù)均默認(rèn)為 url
# 發(fā)送GET請求并獲取響應(yīng)內(nèi)容 response = requests.get("https://www.example.com") # 發(fā)送帶參數(shù)的GET請求。字典傳遞參數(shù),如果值為None的鍵不會被添加到url中 params = {'key1': 'value1', 'key2': 'value2'} response = requests.get("https://www.example.com", params=params)
- post() :發(fā)送 Post 請求,返回一個 Response 對象
第一個參數(shù)均默認(rèn)為 url
import requests import json # 發(fā)送POST請求并傳遞數(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() :獲取會話對象。能夠跨請求保持某些參數(shù)
requests.get() 或 requests.post() 等都是一次性請求,如果需要傳參 cookies 或 headers,則每次請求都需要傳參。
如果使用 session 來發(fā)起請求,session 實例在請求了一個網(wǎng)站后,對方服務(wù)器設(shè)置在本地的 cookie 會自動保存在 session 對象中,下一次再使用 session 請求對方服務(wù)器的時候,會直接帶上前一次的 cookie,從而實現(xiàn)回話保持。
session = requests.Session() # cookies或者session或者token保存于session對象中 session.auth = ('auth','passwd') session.headers = {'key':'value'} response = session.get('url')
方法常用參數(shù)
- url :請求地址。發(fā)送請求方法的第一個參數(shù)均默認(rèn)為 url
- data :設(shè)置請求體,格式默認(rèn)為字典
- params:設(shè)置查詢參數(shù)字典
- headers:設(shè)置請求體,格式為字典
- timeout :設(shè)置秒數(shù)超時,僅對于連接有效
一旦超過這個時間還沒獲得響應(yīng)內(nèi)容,就會提示錯誤(需要異常處理)
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è)置訪問代理。通過代理可設(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è)置身份驗證
import requests from requests.auth import HTTPBasicAuth resp = requests.get('url', auth=HTTPBasicAuth('user', 'passwd')) #resp = requests.get('url', auth=('user', 'passwd')) # 簡寫 #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)體,會自動根據(jù)響應(yīng)頭部的字符編碼進(jìn)行解碼。
- content :以字節(jié)形式(二進(jìn)制)返回。字節(jié)方式的響應(yīng)體,會自動解碼 gzip 和 deflate 壓縮。
- headers :以字典對象存儲服務(wù)器響應(yīng)頭,但是這個字典比較特殊,字典鍵不區(qū)分大小寫,若鍵不存在則返回 None
- status_code :響應(yīng)狀態(tài)碼
- raw :返回原始響應(yīng)體,也就是 urllib 的 response 對象,使用 response .raw.read()
- ok :布爾值,查看 http 請求是否成功(狀態(tài)碼:200)
- cookies :cookie 信息
- history :返回重定向信息
注:可以在請求時加上 allow_redirects = false 阻止重定向
特殊方法:
- json() :Requests 中內(nèi)置的 JSON 解碼器,以 json 形式返回
前提返回的內(nèi)容確保是 json 格式的,不然解析出錯會拋異常
- raise_for_status() :失敗請求(非 200 響應(yīng))拋出異常
發(fā)送https請求并忽略SSL證書校驗
https和SSL證書介紹
HTTPS(HyperText Transfer Protocol Secure)是一種安全的超文本傳輸協(xié)議,它結(jié)合了 HTTP 協(xié)議和 SSL/TLS 協(xié)議。HTTPS 使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)協(xié)議來加密和保護(hù)通信數(shù)據(jù)的傳輸。SSL 和 TLS 用于建立加密連接,保護(hù)數(shù)據(jù)傳輸?shù)陌踩院屯暾浴?/p>
HTTPS 和 SSL 證書的關(guān)系及工作流程:
- 建立安全連接: 客戶端發(fā)起 HTTPS 請求時,客戶端和服務(wù)器首先建立一個安全連接。
- 握手過程: 這個連接的建立通過 SSL/TLS 握手過程實現(xiàn)。在這個過程中,服務(wù)器將自己的 SSL 證書發(fā)送給客戶端。
- 證書驗證: 客戶端收到服務(wù)器的 SSL 證書后,會驗證證書的有效性,包括驗證證書的簽名是否有效,是否過期,是否與請求的域名匹配等。
- 密鑰交換: 客戶端和服務(wù)器通過 SSL/TLS 握手過程協(xié)商加密算法和密鑰,以建立一個加密通道。
- 加密通信: 一旦加密通道建立,客戶端和服務(wù)器之間的數(shù)據(jù)傳輸將通過選定的加密算法加密,確保通信的安全性。
SSL 證書在這個過程中起到關(guān)鍵作用,它用于驗證服務(wù)器的身份,并確定加密通道的加密參數(shù)。服務(wù)器的 SSL 證書由受信任的第三方機構(gòu)(CA)簽發(fā),客戶端通過信任這些 CA 來驗證服務(wù)器的身份。
要實現(xiàn) HTTPS 通信,需要向一個受信任的 CA 申請 SSL 證書,并將其安裝到服務(wù)器上。當(dāng)客戶端通過 HTTPS 請求網(wǎng)站時,它們會驗證服務(wù)器的 SSL 證書,并確保連接是安全的。
requests發(fā)送https請求并忽略SSL證書校驗
在某些情況下,可能需要在使用 requests
發(fā)送 HTTPS 請求時忽略 SSL 證書驗證,例如在測試環(huán)境或自簽名證書的情況下。
可以通過設(shè)置 verify
參數(shù)為 False
來實現(xiàn)忽略 SSL 證書驗證。
注意:
1、即使在使用 requests
發(fā)送請求時將 verify
參數(shù)設(shè)置為 False
,仍然會進(jìn)行 SSL/TLS 握手。
verify=False
只是告訴 requests
跳過 SSL 證書驗證,而不會禁止 SSL/TLS 握手過程。
2、SSL/TLS 握手是建立安全連接的關(guān)鍵步驟,它用于協(xié)商加密算法、密鑰交換和建立加密通道。
即使不驗證服務(wù)器的 SSL 證書(使用 verify=False
),仍然需要進(jìn)行 SSL/TLS 握手以確保通信的安全性。
3、使用 verify=False
時,SSL/TLS 握手過程會進(jìn)行,但在握手過程中會跳過對服務(wù)器 SSL 證書的驗證。這意味著即使服務(wù)器的證書無效或過期,握手也會繼續(xù)進(jìn)行,但連接可能不安全,因為無法保證正在連接到正確的服務(wù)器。
4、如果想完全跳過 SSL/TLS 握手,而不建立安全連接,可以考慮直接使用普通的 HTTP 連接,而不是 HTTPS。
但這樣會使通信不安全,不推薦在生產(chǎn)環(huán)境中使用。如果需要安全連接,建議使用合法有效的 SSL 證書,并允許 SSL/TLS 握手過程來確保連接的安全性。
[SSL: DH_KEY_TOO_SMALL] dh key too small 報錯:
SSL/TLS 握手過程中可能會出現(xiàn) DH(即 Diffie-Hellman,密鑰交換協(xié)議/算法)密鑰長度過小的問題。這通常是由于使用過小的 DH 密鑰長度或不安全的DH密鑰交換算法導(dǎo)致的。
在新的 SSL/TLS 標(biāo)準(zhǔn)中,強制要求使用安全的密鑰長度和加密算法,以確保通信的安全性。一些舊的、不安全的加密算法或密鑰長度會被標(biāo)記為不安全,因此會導(dǎo)致類似的錯誤。
**解決方案:**在請求中設(shè)置合適的 ciphers 來排除 DH 密鑰長度過小的加密套件。但這并不是安全的解決辦法,因為它會降低通信的安全性。
方式1:使用 ssl_default_context 指定允許的加密算法
import requests import ssl url = 'https://example.com' # 替換為你要請求的 HTTPS URL # 禁用 SSL 校驗 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 請求 response = requests.get(url, verify=ssl_context)
方式2:使用 requests.packages.urllib3 包指定允許的加密算法
可以使用 requests.packages.urllib3 包來處理與 SSL 相關(guān)的功能。在這種情況下,可以使用 DEFAULT_CIPHERS 常量來設(shè)置默認(rèn)的加密算法。
注意:requests.packages.urllib3 靜態(tài)編譯可能會顯示找不到,忽略即可,因為其可能是動態(tài)加載的
import requests url = 'https://example.com' # 替換為你要請求的 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 請求 response = requests.get(url, verify=False)
到此這篇關(guān)于requests庫發(fā)送http請求的示例代碼的文章就介紹到這了,更多相關(guān)requests發(fā)送http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實現(xiàn)圖像處理之PiL依賴庫的案例應(yīng)用詳解
這篇文章主要介紹了python實現(xiàn)圖像處理之PiL依賴庫的案例應(yīng)用詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Python基于更相減損術(shù)實現(xiàn)求解最大公約數(shù)的方法
這篇文章主要介紹了Python基于更相減損術(shù)實現(xiàn)求解最大公約數(shù)的方法,簡單說明了更相減損術(shù)的概念、原理并結(jié)合Python實例形式分析了基于更相減損術(shù)實現(xiàn)求解最大公約數(shù)的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2018-04-04Python根據(jù)給定模型進(jìn)行特征權(quán)值計算
在機器學(xué)習(xí)中,特征權(quán)重的計算是理解模型如何做出預(yù)測的重要步驟,本文將詳細(xì)介紹如何使用Python根據(jù)給定模型計算特征權(quán)重,希望對大家有一定的幫助2024-11-11詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系
這篇文章主要介紹了詳解matplotlib中pyplot和面向?qū)ο髢煞N繪圖模式之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01