使用Python Requests提交表单未获取网页预期查询结果的技术求助
解决requests提交表单未返回预期结果的问题
你的代码没拿到预期结果,大概率是这几个原因导致的,对应解决方法如下:
1. 确认表单的实际提交目标和请求方法
很多网站的表单不会直接提交到当前页面,你需要先排查:
- 打开目标页面,按F12打开开发者工具,切换到Network标签
- 手动提交一次查询,找到对应的请求,查看:
Request URL:这才是真正要提交的接口地址,不是当前页面的URLRequest Method:确认是POST还是GET,你的代码用了POST,但实际可能是GET
2. 补全所有必填表单字段
只传wavelength_range可能不够,表单通常包含隐藏字段(比如CSRF令牌)或其他必填项:
- 在Network的请求详情里,查看
Form Data部分,把所有字段都加入你的请求数据中 - 比如很多Django站点会要求
csrfmiddlewaretoken字段,这个需要先从页面源码中提取
3. 模拟浏览器请求头
服务器可能会拒绝无标识的请求,需要添加User-Agent等头信息模拟浏览器
修正后的示例代码
情况1:表单是POST提交且需要CSRF令牌
import requests import re # 用会话保持cookie,避免重复处理 session = requests.Session() base_url = "https://linelist.pa.uky.edu/newpage/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 先访问页面,获取CSRF令牌和cookie page_res = session.get(base_url, headers=headers) csrf_token = re.search(r'<input type="hidden" name="csrfmiddlewaretoken" value="(.*?)">', page_res.text).group(1) # 构造完整表单数据(根据实际Form Data调整) form_data = { "wavelength_range": "6100-6500", "csrfmiddlewaretoken": csrf_token, "submit": "Search" # 假设提交按钮的name是submit,值为Search } # 替换为实际的提交接口URL submit_url = "https://linelist.pa.uky.edu/newpage/submit" result_res = session.post(submit_url, data=form_data, headers=headers) print(result_res.text)
情况2:页面用JS动态渲染结果
如果查询结果是通过JavaScript加载的,requests无法获取动态内容,需要用Selenium模拟浏览器:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(需要对应浏览器的驱动) driver = webdriver.Chrome() driver.get("https://linelist.pa.uky.edu/newpage/") # 输入波长范围 input_field = driver.find_element(By.NAME, "wavelength_range") input_field.send_keys("6100-6500") # 点击提交按钮 submit_btn = driver.find_element(By.CSS_SELECTOR, 'input[type="submit"]') submit_btn.click() # 等待结果加载完成(根据实际页面元素调整等待条件) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "result-content")) ) # 打印结果页面内容 print(driver.page_source) driver.quit()
关键排查步骤
始终以浏览器实际发送的请求为标准:
- 手动提交查询,抓包看完整请求参数
- 对比你的代码请求和浏览器请求的差异(URL、方法、字段、头信息)
- 逐步调整代码,对齐浏览器的请求格式
内容的提问来源于stack exchange,提问作者mari
相关产品推荐
相关产品推荐

