python通過http上傳文件思路詳解
這里主要是解決multipart/form-data這種格式的文件上傳,基本現(xiàn)在http協(xié)議上傳文件基本上都是通過這種格式上傳
1 思路
一般情況下,如果我們往一個(gè)地址上傳文件,則必須要登陸,登陸成功后,拿到cookies,然后在上傳文件的請求攜帶這個(gè)cookies。
然后我們就需要通過瀏覽器在網(wǎng)站上傳文件,這個(gè)時(shí)候我們需要打開瀏覽器的開發(fā)者工具或者fiddler,然后按照抓到包組裝我們的上傳文件的post請求
大家把握一個(gè)原則就是:在post請求中,用files參數(shù)來接受文件對象相關(guān)的參數(shù),通過data/json參數(shù)接受post請求體的其他參數(shù)即可。
2 實(shí)現(xiàn)
2.1 登陸網(wǎng)站
使用requests.session()對象登陸網(wǎng)站,這里主要為了方便,下次直接用這個(gè)對象發(fā)送post上傳文件的請求即可,不需要我們在請求體中添加cookies
查找登錄的URL

查找請求頭

查找登錄參數(shù)

代碼如下:
import requests
s = requests.session()
res1 = s.post(
url="http://127.0.0.1:5000/login",
headers={
'Host': '127.0.0.1:5000',
'Connection': 'keep-alive',
'Content-Length': '28',
'Cache-Control': 'max-age=0',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
'sec-ch-ua-mobile': '?0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://127.0.0.1:5000',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Referer': 'http://127.0.0.1:5000/login',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
data={
"account": "admin",
"password": "admin"
}
)
2.2 手動(dòng)上傳文件,分析http請求的參數(shù)
由于谷歌瀏覽器無法查看上傳文件時(shí)http請求的參數(shù),故使用fiddler來進(jìn)行抓包

抓包情況如下:

說明:
上圖中第一個(gè)紅框中參數(shù)后面全是亂碼,這里就是我們上傳的文件二進(jìn)制格式的表現(xiàn),這里的數(shù)據(jù)就是通過files參數(shù)接收
第二個(gè)紅框中name的值就是k,比如cid就是k值,下一行的值 7 就是v,這里的參數(shù)就是要通過data參數(shù)接收
上面是http請求的raw格式,我們一般會(huì)看webForms格式的http請求
分
析完成后,可以看下代碼:
res2 = s.post(
url="http://127.0.0.1:5000/upload",
headers={
'Host': '127.0.0.1:5000',
'Connection': 'keep-alive',
'Content-Length': '28',
'Cache-Control': 'max-age=0',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
'sec-ch-ua-mobile': '?0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://127.0.0.1:5000',
# 'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Referer': 'http://127.0.0.1:5000/login',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9'
},
files={
"filename_list": open("./test", "rb"),
"Content-Type": "text/plain",
"Content-Disposition": "form-data",
"filename": "test"
},
data={
"cid": "7"
}
)
3 三個(gè)關(guān)鍵點(diǎn)
3.1 data參數(shù)
注意看k值和抓包中的對比


3.2 files參數(shù)
這里很關(guān)鍵,這里就是我們上傳的文件對象了。filename_list 這個(gè)參數(shù)就代表文件文件對象,filename 這個(gè)值一般就是上傳后的文件的名稱(可以不寫)


3.3 content-type參數(shù)
如果我們通過form-data的方式上傳文件,我們組裝post請求的時(shí)候,headers這個(gè)參數(shù)中一定不能要包括這個(gè)值,由requests庫幫添加這個(gè)元素
如果我們自作聰明,會(huì)導(dǎo)致上傳失敗的,這里非常重要?。?!
大家可以看到,我在代碼中沒有傳遞content-type這個(gè)參數(shù),但是抓包是有這個(gè)參數(shù)的,所以這個(gè)參數(shù)我們一定不能加

實(shí)際抓包有這個(gè)參數(shù)

實(shí)際上傳抓包驗(yàn)證即可,和瀏覽器上傳略有不同,但是不影響上傳
到此這篇關(guān)于python通過http上傳文件的文章就介紹到這了,更多相關(guān)python上傳文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas統(tǒng)計(jì)計(jì)數(shù)value_counts()的使用
本文主要介紹了Pandas統(tǒng)計(jì)計(jì)數(shù)value_counts()的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Python Numpy實(shí)現(xiàn)修改數(shù)組形狀
NumPy(Numerical Python)是Python中用于處理數(shù)組和矩陣的重要庫,它提供了豐富的功能,用于科學(xué)計(jì)算,本文主要介紹了如何使用NumPy提供的方法來改變數(shù)組的形狀,感興趣的可以了解下2023-11-11
Python利用sched模塊實(shí)現(xiàn)定時(shí)任務(wù)
今天我們來介紹一下Python當(dāng)中的定時(shí)任務(wù),主要用到的模塊是sched,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04
python 按照sheet合并多個(gè)Excel的示例代碼(多個(gè)sheet)
這篇文章主要介紹了python 按照sheet合并多個(gè)Excel的示例代碼(多個(gè)sheet),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具
本文主要介紹了Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
python 3.6.7實(shí)現(xiàn)端口掃描器
這篇文章主要為大家詳細(xì)介紹了python 3.6.7實(shí)現(xiàn)端口掃描器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09

