深入了解Python中Requests庫的使用
Requests模塊
Requests是一個功能強(qiáng)大的Python HTTP庫,用于發(fā)送HTTP請求,獲取響應(yīng)數(shù)據(jù)。它簡化了與HTTP資源的交互,提供了簡潔且易于使用的API。
文檔:https://requests.readthedocs.io/projects/cn/zh_CN/latest/
要使用Requests模塊,首先需要安裝它,可以使用pip來安裝最新版本的Requests
pip install requests pip3 install requests
簡單使用
安裝完成后,就可以在Python代碼中導(dǎo)入Requests模塊并使用它了。
發(fā)送GET請求
使用Requests發(fā)送GET請求:
# 導(dǎo)入模塊 import requests # 目標(biāo)url url = 'https://www.baidu.com' # 向目標(biāo)url發(fā)送get請求 response = requests.get(url) # 打印響應(yīng)內(nèi)容 print(response.text) # 解碼:解決中文亂碼問題 print(response.content.decode())
發(fā)送POST請求
使用Requests發(fā)送POST請求:
# 導(dǎo)入模塊
import requests
# 定義請求地址
url = 'http://127.0.0.1:8080/login'
# 定義自定義請求頭
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 定義post請求參數(shù)
data = {
"username": "admin",
"password": "123456"
}
# 使用 POST 請求參數(shù)發(fā)送請求
response = requests.post(url, headers=headers, data=data)
# 獲取響應(yīng)的 html 內(nèi)容
html = response.content.decode("utf-8")
print(html)使用Response響應(yīng)對象
獲取響應(yīng)內(nèi)容可以使用response.text或response.content
response.text是將response.content(bytes類型)進(jìn)行解碼的字符串。
response.content是直接從網(wǎng)絡(luò)上抓取的數(shù)據(jù),沒有經(jīng)過任何解碼,是一個 bytes類型的數(shù)據(jù)。
解碼需要指定一個編碼方式,服務(wù)器不指定的話, requests會根據(jù)HTTP頭部對響應(yīng)的編碼,如<meta charset="utf-8">進(jìn)行猜測,默認(rèn)編碼是"ISO-8859-1"。猜測錯誤,就會導(dǎo)致解碼產(chǎn)生亂碼。因此需要使用response.content.decode()來解決中文亂碼
decode函數(shù)解決中文亂碼
常見編碼字符集
utf-8
gbk
gb2312
ascii
iso-8859-1
response.content.decode() 默認(rèn)utf-8
response.content.decode("GBK")常用屬性或方法
- response = requests.get(url):response是發(fā)送請求獲取的響應(yīng)對象
- response.text、response.content:獲取響應(yīng)內(nèi)容
- response.url響應(yīng)的url:有時候響應(yīng)的url和請求的url并不一致
- response.status_code:響應(yīng)狀態(tài)碼
- response.request.headers:響應(yīng)對象的請求頭
- response.headers:響應(yīng)頭
- response.request._cookies:響應(yīng)對應(yīng)請求的cookie,返回cookieJar類型
- response.cookies:應(yīng)中攜帶的cookies,經(jīng)過set-cookie動作,返回cookieJar類型
- response.json():自動將json字符串類型的響應(yīng)內(nèi)容轉(zhuǎn)換為python對象(dict or list)
設(shè)置headers請求頭
可以使用headers參數(shù)來設(shè)置請求頭
headers參數(shù)用于攜帶請求頭發(fā)送請求的方法
headers參數(shù)接收字典形式的請求頭,請求頭字段名作為key,字段對應(yīng)的值作為value
import requests
# 目標(biāo)url
url = 'https://www.baidu.com'
# 請求頭
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
# 向目標(biāo)url發(fā)送get請求
response = requests.get(url, headers=headers)
# 打印響應(yīng)內(nèi)容
print(response.content.decode())
# 打印請求頭信息
print(response.request.headers)處理Cookies
1.攜帶cookie
在headers參數(shù)中攜帶cookie。
從瀏覽器中復(fù)制User-Agent和Cookie
瀏覽器中的請求頭字段和值與headers參數(shù)中必須一致
headers請求參數(shù)字典中的Cookie鍵對應(yīng)的值是字符串
# 請求頭
import requests
# 構(gòu)造請求頭字典
headers = {
# 瀏覽器中復(fù)制的User-Agent
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
# 瀏覽器中復(fù)制的Cookie
'Cookie': 'BIDUPSID=DA34A47255629CF319B6868F08DC207F; PSTM=1658846527; BAIDUID=DA34A47255629CF32D59A4FD90F6BB95:SL=0:NR=10:FG=1;'
}
url = 'https://www.baidu.com/s'
# 請求參數(shù) 字典
params = {'wd': 'java'}
# 向目標(biāo)url發(fā)送get請求
response = requests.get(url, headers=headers, params=params)
# 打印響應(yīng)內(nèi)容
print(response.content.decode())2.cookies參數(shù)
可以在headers參數(shù)中攜帶cookie,也可以使用專門的cookies參數(shù)。cookie一般有過期時間,一旦過期需要重新獲取
cookies參數(shù)是一個字典形式:
cookies = {"cookie的name":"cookie的value"}cookies參數(shù)的使用:
# 構(gòu)造cookies字典
cookies_str = '瀏覽器中復(fù)制的cookies字符串'
cookies_dict = {cookie.split('=')[0]: cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
# 請求頭參數(shù)字典中攜帶cookie字符串
response = requests.get(url, headers=headers, cookies=cookies_dict)3.cookieJar對象
使用requests獲取的resposne對象,具有cookies屬性。該屬性值是一個cookieJar類型,包含服務(wù)器設(shè)置在本地的cookie。
cookies操作
# 返回 RequestsCookieJar對象 cookies = response.cookies # RequestsCookieJar 轉(zhuǎn) cookies字典 requests.utils.dict_from_cookiejar(cookies) # cookies字典 轉(zhuǎn) RequestsCookieJar requests.utils.cookiejar_from_dict() # 對cookie進(jìn)行操作,把一個字典添加到cookiejar中 requests.utils.add_dict_to_cookiejar()
設(shè)置超時時間
使用timeout參數(shù)來設(shè)置請求的超時時間(秒)。
import requests url = 'url' # 設(shè)置超時時間,發(fā)送請求后,3秒鐘內(nèi)返回響應(yīng),否則就拋出異常 response = requests.get(url, timeout=3)
發(fā)送帶參數(shù)的請求
在url攜帶參數(shù)
import requests
# 目標(biāo)url
url = 'https://www.baidu.com/s?wd=java'
# 請求頭
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
# 向目標(biāo)url發(fā)送get請求
response = requests.get(url, headers=headers)
# 打印響應(yīng)內(nèi)容
print(response.content.decode())通過params攜帶參數(shù)
構(gòu)建請求參數(shù)字典,向接口發(fā)送請求的時候帶上參數(shù)字典,參數(shù)字典設(shè)置給params
# 請求頭
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
url = 'https://www.baidu.com/s'
# 請求參數(shù) 字典
params = {'wd': 'java'}
# 向目標(biāo)url發(fā)送get請求
response = requests.get(url, headers=headers, params=params)
# 打印響應(yīng)內(nèi)容
print(response.content.decode())proxy代理
概述
在Requests模塊中,可以使用代理服務(wù)器proxy來發(fā)送HTTP請求。代理可以在你和目標(biāo)服務(wù)器之間充當(dāng)中間人,用于在請求過程中轉(zhuǎn)發(fā)請求和響應(yīng)。使用代理有多種用途,例如隱藏真實的IP地址、繞過網(wǎng)絡(luò)限制等。
通過指定代理IP,可以讓代理服務(wù)器轉(zhuǎn)發(fā)發(fā)送請求。這種方式被稱為正向代理,它充當(dāng)了客戶端和目標(biāo)服務(wù)器之間的中間人,代理服務(wù)器接收來自客戶端的請求,并將其轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,然后將響應(yīng)返回給客戶端。
正向代理和反向代理區(qū)別:
1.正向代理
為發(fā)送請求的一方(瀏覽器或客戶端)轉(zhuǎn)發(fā)請求的,會知道最終處理請求的服務(wù)器的真實地址,例如VPN
2.反向代理
不為發(fā)送請求的一方(瀏覽器或客戶端)轉(zhuǎn)發(fā)請求、而是為最終處理請求的服務(wù)器轉(zhuǎn)發(fā)請求的,不會知道服務(wù)器的真實地址,例如nginx
代理分類
1.根據(jù)代理ip的匿名程度,代理IP可以分為三類:
1.透明代理(Transparent Proxy):
透明代理雖然可以直接隱藏你的IP地址,但是還是可以查到你是誰。
目標(biāo)服務(wù)器接收到的請求頭如下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
2.匿名代理(Anonymous Proxy):
使用匿名代理,別人只能知道你用了代理,無法知道你是誰。
目標(biāo)服務(wù)器接收到的請求頭如下:
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
3.高匿代理(Elite proxy或High Anonymity Proxy):
高匿代理讓別人根本無法發(fā)現(xiàn)你是在用代理,所以是最好的選擇。毫無疑問使用高匿代理效果最好。
目標(biāo)服務(wù)器接收到的請求頭如下:
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
2.根據(jù)網(wǎng)站所使用的協(xié)議不同,需要使用相應(yīng)協(xié)議的代理服務(wù)
從代理服務(wù)請求使用的協(xié)議可以分為:
proxies代理參數(shù)的使用
為了讓服務(wù)器以為不是同一個客戶端在請求,為了防止頻繁向一個域名發(fā)送請求被封ip,所以需要使用代理ip
http代理:目標(biāo)url為http協(xié)議
https代理:目標(biāo)url為https協(xié)議
socks隧道代理,例如socks5代理:
- socks 代理只是簡單地傳遞數(shù)據(jù)包,不關(guān)心是何種應(yīng)用協(xié)議(FTP、HTTP和HTTPS等)
- socks 代理比http、https代理耗時少
- socks 代理可以轉(zhuǎn)發(fā)http和https的請求
注意:
如果proxies字典中包含有多個鍵值對,發(fā)送請求時將按照url地址的協(xié)議來選擇使用相應(yīng)的代理ip
其他功能服務(wù)
忽略CA證書
瀏覽器訪問某些網(wǎng)址時,會提示:您的連接不是私密連接,這是因為網(wǎng)站的CA證書沒有經(jīng)過受信任的根證書頒發(fā)機(jī)構(gòu)的認(rèn)證。當(dāng)執(zhí)行請求時,會拋出包含ssl.CertificateError等字樣的異常。
import requests url = "url " # 設(shè)置忽略證書 verify參數(shù)設(shè)置為False表示不驗證CA證書 response = requests.get(url,verify=False)
圖片下載
下載圖片時,后綴名和請求的后綴名一致,必須使用response.content進(jìn)行保存文件
import requests
# 下載圖片地址
url = "https://pic.netbian.com/uploads/allimg/180826/113958-153525479855be.jpg"
# 發(fā)送請求獲取響應(yīng)
response = requests.get(url)
# 保存圖片
with open('image.png', 'wb') as f:
f.write(response.content)重試處理
retrying模塊可以通過裝飾器模式對某個函數(shù)進(jìn)行監(jiān)控,如果該函數(shù)引發(fā)異常就會觸發(fā)重試操作
安裝retrying模塊
pip install retrying
# 導(dǎo)入模塊
import time
import requests
# 使用第三方模塊 retrying 模塊
from retrying import retry
# 使用裝飾器進(jìn)行重試設(shè)置
# stop_max_attempt_number 表示重試次數(shù)
@retry(stop_max_attempt_number=3)
def test():
print("Test 重試次數(shù)")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
url = "http://127.0.0.1:8888"
# 設(shè)置超時參數(shù)
response = requests.get(url, headers=headers, timeout=1)
return response.text
if __name__ == '__main__':
try:
html = test()
except Exception as e:
print(e)
time.sleep(10)Test 重試次數(shù)
Test 重試次數(shù)
Test 重試次數(shù)
HTTPConnectionPool(host='127.0.0.1', port=8888): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001CF901742B0>, 'Connection to 127.0.0.1 timed out. (connect timeout=1)'))
session狀態(tài)保持
requests模塊中的Session類能夠自動處理發(fā)送請求獲取響應(yīng)過程中產(chǎn)生的cookie,進(jìn)而達(dá)到狀態(tài)保持的目的。
session實例在請求一個網(wǎng)站后,對方服務(wù)器設(shè)置在本地的cookie會保存在session中,下一次再使用session請求對方服務(wù)器的時候,會帶上前一次的cookie
session對象發(fā)送get或post請求的參數(shù),與requests模塊發(fā)送請求的參數(shù)完全一致
# 實例化session對象 session = requests.session() # 一次請求 response = session.get(url, headers) # 下一次請求 response = session.post(url, data)
以上就是深入了解Python中Requests庫的使用的詳細(xì)內(nèi)容,更多關(guān)于Python Requests庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pandas數(shù)據(jù)集的合并與連接merge()方法
Pandas數(shù)據(jù)集的合并與連接(merge())是數(shù)據(jù)處理過程中常用的操作之一,在使用Pandas進(jìn)行數(shù)據(jù)集合并時,可以使用merge()函數(shù)將兩個或多個數(shù)據(jù)集按照指定的列進(jìn)行合并,本文就來介紹一下,感興趣的可以了解一下2023-11-11
Python設(shè)置Socket代理及實現(xiàn)遠(yuǎn)程攝像頭控制的例子
這篇文章主要介紹了Python設(shè)置Socket代理及實現(xiàn)遠(yuǎn)程攝像頭控制的例子,皆是對socket模塊的實際運(yùn)用,需要的朋友可以參考下2015-11-11
Django序列化中SerializerMethodField的使用詳解
這篇文章主要介紹了Django序列化中SerializerMethodField的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03

