我們在使用python爬蟲, 例如使用requests想服務(wù)器發(fā)送請求,模擬上傳圖片的時(shí)候會遇到Reqest Headers 中有一個(gè):Content-Type: multipart/form-data; boundary=----WebKitFormBoundary****************,? 嘗試這從其它返回的接口中也找不到它,
我們也一度懷疑是否是在前端JS中生成的,不要著急! 只是向服務(wù)端上傳一個(gè)照片, API接口沒必要設(shè)計(jì)的這么復(fù)雜把??!哈哈哈,
首先我們先觀察一下請求的URL地址以及攜帶的data數(shù)據(jù):
小伙伴們觀察數(shù)據(jù)的時(shí)候要以自己爬取的目標(biāo)網(wǎng)站為準(zhǔn)哦!
我們發(fā)現(xiàn)它是攜帶著? thumbnail_icon 和 thumbnail 參數(shù)向 https:// xxxxxxx 的ajax接口發(fā)送了一個(gè)patch 請求, 攜帶的 thumbnail 的值為空, 而thumbnail 的值就是要上傳的圖片了。
這時(shí)候, 我們需要用到, random, string, 以及 requests_toolbelt 模塊中的 MultipartEncoder 這個(gè)類
第一步: pip install requests_toolbelt 模塊
代碼如下:
import requests
import random
import string
from requests
url = 'https:// xxxxxxxxx'
# 定義 fields 用來加密
fields = {
'thumbnail_icon': '',
# 注意如果是jpeg 則:image/jpeg
'thumbnail': ('圖片.png', open('圖片.png', 'rb'), 'image/png'),
}
# 生成 boundary內(nèi)容,
boundary = '----WebKitFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16))
m = MultipartEncoder(fields=fields, boundary=boundary)
headers = {
"Content-Type": m.content_type
}
response = requests.patch(url, headers=headers, data=m)
print(response.status_code)
其中:??? ''.join(random.sample(string.ascii_letters + string.digits, 16))
string.ascii_letters 返回的是 a-zA-Z 的字符串
string.digits 返回的是 0123456789? 字符串
不明覺厲,
string.ascii_letters + string.digits? 返回的就是 a-zA-Z0-9 的字符串啦
然后再使用random.sample() 方法,隨機(jī)從此字符串中獲取 16 個(gè)字符, 返回的則是一個(gè)列表,
使用 ''.join()方法, 轉(zhuǎn)換列表為字符串, 再和 前面的 ----WebKitFormBoundary 做一個(gè)拼接, 就完成了我們的boundary 值了,
然后使用 MultipartEncoder(fields=fields, boundary=boundary) 將我們要上傳的圖片參數(shù),以及生成的boundary傳入此類中, 然后使用返回的 m對象,調(diào)用器 content_type 屬性,就能獲取Content-Type 的值了, 這樣,我們就能成功模擬發(fā)送請求了?。。?/p>
================================================================
還有一種情況是不帶 image 向服務(wù)器發(fā)送 multipart/form-data 的情況。
我們發(fā)現(xiàn)只向服務(wù)器發(fā)送了一個(gè) description_is_active 參數(shù), 值為 True, 沒有攜帶任何的圖片,
那么我們就不能使用MultiparEncoder()類來完成初始化了,文章來源:http://www.zghlxwxcb.cn/news/detail-757844.html
代碼實(shí)現(xiàn)如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-757844.html
# 我們需要將headers 請求頭中的Content-Type 注釋掉, 這個(gè)參數(shù)是由服務(wù)端為我們生成的,加上會報(bào)錯(cuò)
data = {
"description_is_active": (None, True)
}
headers_data = {
# 一定不要加Content-Type, 不然會報(bào)錯(cuò)
'Authorzation': xxx,
'User-Agent': xxx,
}
# 直接調(diào)用requests 發(fā)送請求即可, 攜帶參數(shù)使用files形參
requests.patch(url, headers=headers, files=data)
到了這里,關(guān)于Python爬蟲關(guān)于網(wǎng)站上傳圖片: Content-Type: multipart/form-data; boundary=----WebKitFormBoundary****************的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!