如何使用 python 请求发送表单数据?
How to send form-data using python requests?
我正在尝试使用 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)
更清楚的是为什么不起作用的部分是两个结果中存在的差异。
With the postman code i got this
该代码是使用以下数据生成的:
所以我尝试使用我自己的代码来做同样的事情,我尝试在文件部分和数据部分发送数据,但没有成功。阅读其他 Whosebug 问题,他们建议使用属于 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)
With the custom code I got the following
如果您同时尝试这两种代码,您会发现结果有何不同。我对第一个感兴趣,那个是通过 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)
我真的不知道为什么这与我尝试做的不同,但它确实有效。如果有人可以评论为什么这有效,我将非常感激。
我正在尝试使用 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)
更清楚的是为什么不起作用的部分是两个结果中存在的差异。
With the postman code i got this
该代码是使用以下数据生成的:
所以我尝试使用我自己的代码来做同样的事情,我尝试在文件部分和数据部分发送数据,但没有成功。阅读其他 Whosebug 问题,他们建议使用属于 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)
With the custom code I got the following
如果您同时尝试这两种代码,您会发现结果有何不同。我对第一个感兴趣,那个是通过 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)
我真的不知道为什么这与我尝试做的不同,但它确实有效。如果有人可以评论为什么这有效,我将非常感激。