Python爬虫关于网站上传图片: Content-Type: multipart/form-data; bound ...

打印 上一主题 下一主题

主题 537|帖子 537|积分 1613

我们在利用python爬虫, 比方利用requests想服务器发送请求,模仿上传图片的时间会遇到Reqest Headers 中有一个:Content-Type: multipart/form-data; boundary=----WebKitFormBoundary****************,  尝试这从别的返回的接口中也找不到它,

我们也一度怀疑是否是在前端JS中天生的,不要发急! 只是向服务端上传一个照片, API接口没必要计划的这么复杂把!!哈哈哈,
首先我们先观察一下请求的URL地点以及携带的data数据:
小同伴们观察数据的时间要以自己爬取的目标网站为准哦!


我们发现它是携带着  thumbnail_icon 和 thumbnail 参数向 https:// xxxxxxx 的ajax接口发送了一个patch 请求, 携带的 thumbnail 的值为空, 而thumbnail 的值就是要上传的图片了。
这时间, 我们必要用到, random, string, 以及 requests_toolbelt 模块中的 MultipartEncoder 这个类
第一步: pip install requests_toolbelt 模块
代码如下:
  1. import requests
  2. import random
  3. import string
  4. from requests
  5. url = 'https:// xxxxxxxxx'
  6. # 定义 fields 用来加密
  7. fields = {
  8.     'thumbnail_icon': '',
  9.      # 注意如果是jpeg 则:image/jpeg
  10.     'thumbnail': ('图片.png', open('图片.png', 'rb'), 'image/png'),
  11. }
  12. # 生成 boundary内容,
  13. boundary = '----WebKitFormBoundary' + ''.join(random.sample(string.ascii_letters + string.digits, 16))
  14. m = MultipartEncoder(fields=fields, boundary=boundary)
  15. headers = {
  16.     "Content-Type": m.content_type
  17. }
  18. response = requests.patch(url, headers=headers, data=m)
  19. 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() 方法,随机从此字符串中获取 16 个字符, 返回的则是一个列表,
利用 ''.join()方法, 转换列表为字符串, 再和 前面的 ----WebKitFormBoundary 做一个拼接, 就完成了我们的boundary 值了,
然后利用 MultipartEncoder(fields=fields, boundary=boundary) 将我们要上传的图片参数,以及天生的boundary传入此类中, 然后利用返回的 m对象,调用器 content_type 属性,就能获取Content-Type 的值了, 如许,我们就能成功模仿发送请求了!!!
================================================================
还有一种情况是不带 image 向服务器发送 multipart/form-data 的情况。


我们发现只向服务器发送了一个 description_is_active 参数, 值为 True, 没有携带任何的图片,
那么我们就不能利用MultiparEncoder()类来完成初始化了,
代码实现如下:
  1. # 我们需要将headers 请求头中的Content-Type 注释掉, 这个参数是由服务端为我们生成的,加上会报错
  2. data = {
  3.     "description_is_active": (None, True)
  4. }
  5. headers_data = {
  6.    
  7.     # 一定不要加Content-Type, 不然会报错
  8.     'Authorzation': xxx,
  9.     'User-Agent': xxx,
  10. }
  11. # 直接调用requests 发送请求即可, 携带参数使用files形参
  12. requests.patch(url, headers=headers, files=data)
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表