如何用Python发送POST请求向网页字段粘贴数据并获取计算结果
你当前直接发POST请求失败,是因为这个站点基于ASP.NET开发,提交表单时除了交易数据外,还需要携带__VIEWSTATE、__EVENTVALIDATION等动态生成的隐藏校验参数,且你直接传入DataFrame的格式也不符合站点要求的表单字段规则。直接构造POST请求虽然可行,但需要先爬取页面提取所有动态参数、模拟表单字段构造,对新手来说门槛较高。
最优实现方案:用Selenium模拟手动操作
这个方案完全模拟你手动粘贴数据、点击按钮的操作,不需要研究复杂的表单参数,上手难度低,适配性强。
第一步:安装依赖库
执行以下命令安装需要的工具:
pip install selenium pandas webdriver-manager
第二步:完整实现代码
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 1. 读取并格式化交易数据 # 这里假设你的csv列和示例数据顺序一致:交易类型、日期、标的、数量、单价、费用、其他 df = pd.read_csv("/Users/Test.csv", header=None, sep="\s+") # 转成站点要求的换行分隔的文本格式 trade_text = "\n".join(["\t".join(map(str, row)) for _, row in df.iterrows()]) # 2. 启动浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("http://www.cgtcalculator.com/calculator.aspx") try: # 3. 定位输入框,粘贴交易数据 textarea = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "TEXTAREA1")) ) textarea.clear() textarea.send_keys(trade_text) # 4. 点击Format/Sort按钮 format_btn = driver.find_element(By.ID, "Button2") format_btn.click() # 等待处理完成 WebDriverWait(driver, 5).until(lambda d: d.execute_script("return document.readyState") == "complete") # 5. 点击Calculate按钮 calc_btn = driver.find_element(By.ID, "Button1") calc_btn.click() # 等待结果加载完成,这里的选择器可以自己替换成实际结果元素的属性 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "result")) ) # 6. 提取结果,根据实际要拿的内容修改选择器即可 result = driver.find_element(By.CLASS_NAME, "result").text print(result) finally: # 关闭浏览器 driver.quit()
代码调整说明
- 你可以打开浏览器F12的元素选择器,核对两个按钮的ID、结果元素的选择器,替换代码里对应的参数即可。
- 如果不想看到弹出的浏览器窗口,可以给Chrome添加无头模式参数:
options = webdriver.ChromeOptions() options.add_argument("--headless=new") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
直接用requests请求的注意事项
如果你要坚持用requests方案,需要做以下修改:
- 先发送GET请求到目标页面,从返回的HTML中提取所有
input type="hidden"的字段值,包括__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION等 - 构造POST的表单数据,除了上面的隐藏字段,还要传入
TEXTAREA1=你的交易数据文本,以及点击的按钮对应的字段(比如点击Calculate就是Button1=Calculate) - 确保headers里带好Referer等参数,再发POST请求,就能拿到计算后的结果页面
这个方案运行效率更高,但需要你自己抓包核对所有表单字段,新手优先选择Selenium方案。
内容的提问来源于stack exchange,提问作者Tcs106
相关产品推荐
相关产品推荐

