您好,登錄后才能下訂單哦!
這篇文章主要介紹“python如何通過(guò)http上傳文件”,在日常操作中,相信很多人在python如何通過(guò)http上傳文件問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python如何通過(guò)http上傳文件”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
一般情況下,如果我們往一個(gè)地址上傳文件,則必須要登陸,登陸成功后,拿到cookies,然后在上傳文件的請(qǐng)求攜帶這個(gè)cookies。
然后我們就需要通過(guò)瀏覽器在網(wǎng)站上傳文件,這個(gè)時(shí)候我們需要打開(kāi)瀏覽器的開(kāi)發(fā)者工具或者fiddler,然后按照抓到包組裝我們的上傳文件的post請(qǐng)求
大家把握一個(gè)原則就是:在post請(qǐng)求中,用files參數(shù)來(lái)接受文件對(duì)象相關(guān)的參數(shù),通過(guò)data/json參數(shù)接受post請(qǐng)求體的其他參數(shù)即可。
2.1 登陸網(wǎng)站
使用requests.session()對(duì)象登陸網(wǎng)站,這里主要為了方便,下次直接用這個(gè)對(duì)象發(fā)送post上傳文件的請(qǐng)求即可,不需要我們?cè)谡?qǐng)求體中添加cookies
查找登錄的URL
查找請(qǐng)求頭
查找登錄參數(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請(qǐng)求的參數(shù)
由于谷歌瀏覽器無(wú)法查看上傳文件時(shí)http請(qǐng)求的參數(shù),故使用fiddler來(lái)進(jìn)行抓包
抓包情況如下:
說(shuō)明:
上圖中第一個(gè)紅框中參數(shù)后面全是亂碼,這里就是我們上傳的文件二進(jìn)制格式的表現(xiàn),這里的數(shù)據(jù)就是通過(guò)files參數(shù)接收
第二個(gè)紅框中name的值就是k,比如cid就是k值,下一行的值 7 就是v,這里的參數(shù)就是要通過(guò)data參數(shù)接收
上面是http請(qǐng)求的raw格式,我們一般會(huì)看webForms格式的http請(qǐng)求
分
析完成后,可以看下代碼:
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.1 data參數(shù)
注意看k值和抓包中的對(duì)比
3.2 files參數(shù)
這里很關(guān)鍵,這里就是我們上傳的文件對(duì)象了。filename_list 這個(gè)參數(shù)就代表文件文件對(duì)象,filename 這個(gè)值一般就是上傳后的文件的名稱(可以不寫)
3.3 content-type參數(shù)
如果我們通過(guò)form-data的方式上傳文件,我們組裝post請(qǐng)求的時(shí)候,headers這個(gè)參數(shù)中一定不能要包括這個(gè)值,由requests庫(kù)幫添加這個(gè)元素
如果我們自作聰明,會(huì)導(dǎo)致上傳失敗的,這里非常重要?。?!
大家可以看到,我在代碼中沒(méi)有傳遞content-type這個(gè)參數(shù),但是抓包是有這個(gè)參數(shù)的,所以這個(gè)參數(shù)我們一定不能加
實(shí)際抓包有這個(gè)參數(shù)
實(shí)際上傳抓包驗(yàn)證即可,和瀏覽器上傳略有不同,但是不影響上傳
到此,關(guān)于“python如何通過(guò)http上傳文件”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。