Python漂亮的汤和请求在post url上提交表单数据

问题描述

如何在网址上发布表单数据:http://washington.kdmid.ru/queue-en/Visitor.aspx

当我提交包含以下字段的表单数据时,我会收到相同的页面作为响应,而不是重定向下一页

import requests
from bs4 import BeautifulSoup

location_url = "http://washington.kdmid.ru/queue-en/visitor.aspx"
s = requests.Session()

main_page = s.get(location_url)

main_html = BeautifulSoup(main_page.text)


c_form = main_html.find_all("form")[0]
c_form_submit = c_form.attrs["action"]
data = {e.attrs.get("name"): e.attrs.get("value") for e in c_form.find_all("input")}

data["ctl00$MainContent$txtFam"] = "bsssabassra"
data["ctl00$MainContent$txtIm"] = "Akssssshassya"
data["ctl00$MainContent$txtOt"] = "a"
data["ctl00$MainContent$txtTel"] = "1122334455"
data["ctl00$MainContent$txtEmail"] = "akssbsars2@gmail.com"
data["ctl00$MainContent$DDL_Day"] = 1
data["ctl00$MainContent$DDL_Month"] = 1
data["ctl00$MainContent$TextBox_Year"] = 1993
data["ctl00$MainContent$DDL_Mr"] = "MR"
data["ctl00$MainContent$txtCode"] = captcha_txt
data["ctl00$MainContent$ButtonA"] = "Next"
import json; json.dumps(data)
submit_captcha_resp = s.post("http://washington.kdmid.ru/queue-en/visitor.aspx",data=json.dumps(data))
final_page = BeautifulSoup(submit_captcha_resp.text)

解决方法

它不会重定向,因为它不是浏览器。 BS 不运行 JS 脚本或 HTML 代码。但是你会得到回应。 您应该使用以下其中一种:

submit_captcha_resp = s.post("yourLongURL",json=data)

submit_captcha_resp = s.post("yourLongURL",data=data)

json.dumps() 用于将 JSON 转换为字符串,但您不需要它,因为您发布数据的网页使用 HTML 标签,而表单标签发布数据而不将其转换为字符串。所以你不应该把它转换成一个字符串。您应该以 JSON 格式发布。

正如@dharmey 所说:如果您收到 404,您应该将用户代理设置为流行的网络浏览器。例如:

{"User-Agent":"Mozilla/5.0"}

而且我认为现在你有更大的问题,比如通过验证码。

,

我认为您可能以错误的方式发布数据。你可以试试

submit_captcha_resp = s.post("http://washington.kdmid.ru/queue-en/visitor.aspx",json=data)

代替data=json.dumps(data))

如果这不起作用/站点需要实际的表单数据,请尝试传入一些 headers,因为服务器可能需要这些数据才能正确接收请求。

你可以只包括

headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}

submit_captcha_resp = s.post("http://washington.kdmid.ru/queue-en/visitor.aspx",headers=headers,data=json.dumps(data))

开始。