Python Jupyter中POST表单数据失败:无法获取目标页面HTML
解决POST请求无法获取目标页面HTML的问题
看起来你遇到的核心问题是几个关键细节没处理好:动态验证令牌、会话保持,还有请求头的正确传递。我帮你一步步拆解并修正代码:
问题分析
- 静态的
__RequestVerificationToken无效:这个令牌是服务器动态生成的,每次访问页面都会变化,你用固定的旧令牌会被服务器拒绝验证。 - 请求头配置错误且未传递:你第二个代码里的header有语法错误(
user-agent的引号配对错误),而且POST请求时根本没把headers参数传进去。 - 未保持会话状态:表单提交依赖SessionId和Cookie,手动复制旧Cookie没用,得用会话对象自动管理。
修正后的代码
首先需要安装beautifulsoup4用来解析页面提取令牌:
pip install beautifulsoup4
然后是完整的脚本:
import requests from bs4 import BeautifulSoup # 初始化会话,自动管理Cookie和Session session = requests.Session() base_url = "https://ar.ec.universal-assistance.com" form_url = f"{base_url}/cotizar-asistencia-al-viajero" target_url = f"{base_url}/ofertas-asistencia-al-viajero" # 第一步:GET表单页面,获取动态的__RequestVerificationToken和会话Cookie response = session.get(form_url) soup = BeautifulSoup(response.text, "html.parser") # 从页面的隐藏输入中提取令牌 token = soup.find("input", {"name": "__RequestVerificationToken"})["value"] # 准备表单数据,替换成最新的令牌 data = { '__RequestVerificationToken': token, 'CCTLD': '.ar', 'CodigoOrganizacion': "", 'CodigoConvenio': "", 'OcultarTipoViaje': 'false', 'CantidadPasajeros': 1, 'CantidadDias': 3, 'Origen': 'ARGENTINA', 'Destino': 'Centro america/Caribe', 'TipoViaje': 'Un viaje', 'FechaInicio': '20/06/2019', 'FechaFin': '22/06/2019', 'Edad1': 27, 'Edad2': "", 'Edad3': "", 'Edad4': "", 'Edad5': "", 'Edad6': "", 'Edad7': "", 'Edad8': "", 'Edad9': "", 'Edad10': "", 'Email': 'no@no.com', 'Nombre': 'PEDRO', 'Apellido': 'PEREZ', 'CodigoArea': 800, 'NumeroTelefono': 9997777, 'dr': "", 'cn': '(direct)', 'cs': '(direct)', 'cm': '(none)', 'ck': '(not set 5)', 'cc': '(not set 5)', 'ua': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36', 'ref': 'ar.ec.universal-assistance.com', 'sr': '1366x768', 'vp': '1366x728' } # 配置正确的请求头(去掉那些非标准的":authority"等字段,requests会自动处理) headers = { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "accept-language": "es-ES,es;q=0.9", "cache-control": "max-age=0", "content-type": "application/x-www-form-urlencoded", "origin": base_url, "referer": form_url, "upgrade-insecure-requests": "1", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" } # 第二步:提交POST请求 post_response = session.post(form_url, data=data, headers=headers) # 第三步:获取目标页面的HTML(因为会话已经通过验证,直接GET即可) target_response = session.get(target_url) print(target_response.text)
关键说明
- 会话对象
requests.Session():自动保存和发送Cookie,确保会话状态一致,不用手动复制旧的Cookie值。 - 动态提取令牌:每次访问表单页面都重新获取最新的
__RequestVerificationToken,避免验证失败。 - 简化请求头:去掉了浏览器开发者工具里显示的非标准字段(比如
:authority、:method),这些requests会自动处理,手动添加反而可能出问题。 - 跳转处理:提交POST后,会话已经处于验证状态,直接GET目标页面就能拿到你想要的HTML。
内容的提问来源于stack exchange,提问作者Alan Diaz
相关产品推荐
相关产品推荐

