通过抓包工具可以看到 表单数据的提交类型为application/x-www-form-urlencoded ↓ ↓ ↓
请求类型
这种类型提交的数据就有可能会是这个样子的↓ ↓ ↓;含有重复的Key 不一样的值
UrlEncode
Raw
这种数据如果通过普通的requests.post(url=url, headers=headers, data={'k': 'v1', 'k': 'v2'})字典方式去发送数据肯定是行不通的;
字典只会保留第二个值.
解决方案:

from urllib import parse
import requests

data = {
    "ID": "xxx",
    "KeyName": ["Value1", "Value2"],  # 以列表的形式来传值
}
# 注意doseq参数如果不填默认为False;就会把列表真的当成列表来编码
# 这里把doseq改为True;把每个序列元素转换为一个单独的参数
data = parse.urlencode(data, doseq=True)
response = requests.post(url='http://www.xxx.com',data=data)
print(response.json())

当然也可以遍历data后,然后使用urlencode转义再用‘=’和‘&’去遍历拼接,太麻烦不推荐


项目示例
demo.py

# _*_ coding: utf-8 _*_
"""
Time:     2022/3/2 16:59
Author:   Jyun
Version:  V 0.1
File:     demo.py
Blog:     https://ctrlcv.blog.csdn.net
"""
import requests


class Items:
    def __init__(self):
        self.data = {}

    def __setitem__(self, key, value):
        self.data[key] = value

    def encode(self):
        from urllib import parse
        return parse.urlencode(self.data, doseq=True)


class UploadForm:
    def __init__(self):
        self.userdata = {}  # 从数据库获取数据
        self.pagedata = {}  # 从页面获取动态数据
        self.url = 'http://cc.com'

    def submit(self):
        data = self.dealt_formdata()
        print(data)  # only-id=None&name=None&sex=None&cardtype%5B1%5D.cardType=...
        # response = requests.post(url=self.url, data=data)
        # print(response.text)

    def dealt_formdata(self):
        item = Items()
        item['cctype'] = ['acc', 'bcc']
        item['cardtype[1].cardValue'] = 'A0001'
        item['cardtype[1].cardType'] = 'DM02-08_09'

        item['only-id'] = self.pagedata.get('only-id')
        item['name'] = self.userdata.get('name')
        if self.userdata.get('sex') == '男':
            item['sex'] = '1'
        else:
            item['sex'] = '2'

        return item.encode()


if __name__ == '__main__':
    uf = UploadForm()
    uf.submit()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐