如何使用python请求发送表单数据?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (33)

我正在尝试使用python 3和请求库发送POST请求。当我使用邮递员时,我正在获得我期望的结果,所以我复制了Postman生成的代码,并以这种方式工作。

这是邮递员代码生成的代码:

import requests

payload = "name=\"claveElector\"\r\n\r\nABCDEF01234567H400\r\nname=\"numeroEmision\"\r\n\r\n01\r\nname=\"ocr\"\r\n\r\n4158093946570\r\nname=\"g-recaptcha-response\"\r\n\r\nsome-captcha\r\nname=\"modelo\"\r\n\r\na"

url = "https://listanominal.ine.mx/scpln/resultado.html"

payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"claveElector\"\r\n\r\nTPRSJC95010209H400\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"numeroEmision\"\r\n\r\n01\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"ocr\"\r\n\r\n4158093946570\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"g-recaptcha-response\"\r\n\r\nsome-re-captcha\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"modelo\"\r\n\r\na\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
    'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

为了更清楚,为什么不工作的部分是两个结果中存在的差异。

随着邮递员代码,我得到了这个

该代码使用以下数据生成:

所以我尝试使用我自己的代码做同样的事情,我试图在文件部分和数据部分中发送数据但是不起作用。阅读其他StackOverflow问题,他们建议使用作为Requests Toolbelt库一​​部分的MultipartEncoder。

所以我的实现结果如下:

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

clave_elector = "ABCDEF01234567H400"
numero_emision = "01"
ocr = "1234567846570"
modelo = "a"

params = {
    "claveElector": clave_elector,
    "numeroEmision": numero_emision,
    "ocr": ocr,
    "modelo": modelo,
    "g-recaptcha-response": ''
}

data = MultipartEncoder(fields = params)

headers = {
    'Content-type': data.content_type
}
response = requests.post(
    'https://listanominal.ine.mx/scpln/resultado.html',
    data = data,
    headers = headers
)
print(response.text)

使用自定义代码,我得到以下内容

如果您尝试这两个代码,则可以看到结果的不同之处。而且我对第一个感兴趣,就是Postman生成的代码。

我不知道为什么我的代码不起作用,我做错了什么?我想说的是,以某种方式我的代码请求没有正确发送,所以网站无法读取它。

提问于
用户回答回答于

经过这么多的尝试和错误,我发现实现这一目标的唯一方法是使用以下代码:

from requests import Request, Session

clave_elector = "TPRSJC95010209H400"
numero_emision = "01"
ocr = "4158093946570"
modelo = "a"

data = {
    "claveElector": clave_elector,
    "numeroEmision": numero_emision,
    "ocr": ocr,
    "modelo": modelo,
    "g-recaptcha-response": 'hjkkjgh'
}

request = Request(
    'POST', 
    'https://listanominal.ine.mx/scpln/resultado.html',
    files = {
        'claveElector': (None, data['claveElector']),
        'numeroEmision': (None, data['numeroEmision']),
        'ocr': (None, data['ocr']),
        'modelo': (None, data['modelo']),
        'g-recaptcha-response': (None, 'xxx'),
    }
).prepare()


s = Session()
response = s.send(request)

print(response.text)

我真的不知道为什么这与我试图做的不同,但它确实有效。如果有人可以评论为什么这有效,我会非常感激。

热门问答

云服务器中ping不可达,请教一下如何恢复?

推荐已采纳
本地主机 ping 不通实例可能由以下问题导致: 目标服务器的设置不正确 域名没有正确解析 链路故障 在确保本地网络正常的前提下(即您可以正常 ping 通其他网站),可根据以下操作进行排查: 检查实例是否配置公网 IP 检查安全组设置 检查系统设置 检查域名是否备案 检查域名解...... 展开详请

为什么加固之后生成四个文件?

腾讯云@移动安全

腾讯 · 移动开发工程师 (已认证)

腾讯云移动安全前端开发
推荐

选择最后一个_legu_aligned_signed.apk 文件,这个是加固并已重签名的文件。

COS Javascript SDK 为何没有 getService 方法?

因为 getService 请求的是 service.cos.myqcloud.com 或 cos.<Region>.myqcloud.com 域名,前端直接请求会导致跨域问题。 前端 js sdk 直接请求 bucket/object 相关的接口,虽然也会跨域,但你可以在 你...... 展开详请

iot设备通过mqtt协议连接,没有办法设置clientid?

DylanRichard

腾讯 · 产品经理 (已认证)

万物互联的时代,欢迎来到IoT的世界
推荐

物联网接入层有设备互踢的逻辑,如果是用同一个设备 ID 在不同地方登录,会导致其中一方被另一方踢下线。因此发现设备一直上下线时,需要确认是否有不同的人或者多线程在使用同一个设备 ID 执行登录操作。

实时语音识别支持c#平台吗?

支持的。虽然SDK没有C#的,但是可以通过API进行请求

如何延长签名有效期?

yinshawnrao

腾讯 · Web开发工程师 (已认证)

腾讯云搬砖工
推荐

如果需要自己生成签名,可以使用对象存储COS的SDK工具,里面有提供方法,获取下载链接,签名时间可以参数控制。

https://cloud.tencent.com/document/product/436/7753

扫码关注云+社区

领取腾讯云代金券