HTML的method="POST"标签如何工作?能否用Python requests模拟对应请求?
解决方案
实现逻辑
- 你遇到的是网站的中间身份校验跳转页,浏览器的自动跳转本质是执行JS提交页面内的隐藏POST表单,这个流程完全可以通过requests模拟实现。
具体实现步骤
- 用
requests.Session()创建会话实例,自动维护请求上下文(包括Cookie、请求头关联等),和浏览器的会话逻辑一致。 - 第一次请求你的原始目标URL,拿到返回的中间页HTML。
- 解析HTML提取表单核心信息:
- 表单
action属性对应的POST提交地址 - 三个隐藏输入框
wa、wresult、wctx对应的value值
- 表单
- 用同一个会话实例向提取到的POST地址提交表单数据,得到的响应就是你预期的目标页面内容。
示例代码
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 初始化会话 session = requests.Session() # 可选:添加浏览器请求头避免被拦截 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }) # 第一步:请求原始目标地址 origin_url = "你最初要访问的站点URL" resp1 = session.get(origin_url) # 第二步:解析中间页提取表单信息 soup = BeautifulSoup(resp1.text, "lxml") form = soup.find("form", {"name": "hiddenform"}) # 处理相对路径的提交地址 post_url = urljoin(origin_url, form["action"]) post_data = { "wa": form.find("input", {"name": "wa"})["value"], "wresult": form.find("input", {"name": "wresult"})["value"], "wctx": form.find("input", {"name": "wctx"})["value"] } # 第三步:提交表单获取目标内容 resp2 = session.post(post_url, data=post_data) # resp2.text 就是你需要的目标页面HTML内容 print(resp2.text)
注意事项
- 如果提取到的action是相对路径,必须用
urljoin拼接成完整的绝对路径再发起请求。 - 若站点有额外的反爬校验,可根据浏览器实际请求的头信息补全session的headers参数即可。
内容的提问来源于stack exchange,提问作者Gorge
相关产品推荐
相关产品推荐

