Python requests获取需Cookie网页转DataFrame时无法通过免责声明页
代码失效的核心原因
- 未使用会话持久化机制:手动在跨请求间传递Cookie的方式,极易丢失服务端设置的会话标识、授权校验Cookie,导致每次请求都被判定为未接受免责声明的游客。
- 请求方法不匹配:多数“接受免责声明”的接口采用POST方法提交校验逻辑,原代码用GET方法访问该接口,服务端无法识别授权操作,不会下发有效访问Cookie。
- 逻辑链路错位:原代码将
acceptDisclaimer接口的响应内容直接作为数据页解析,但该接口仅负责授权校验,返回的是跳转提示或空页面,根本不存在带msgTable类的业务表格。 - 缺少基础请求头模拟:默认requests的请求头会被多数网站的反爬规则识别为爬虫,直接拦截请求。
修正后的可运行实现
import requests import pandas as pd # 初始化持久化会话,自动完成跨请求的Cookie携带、更新 session = requests.Session() # 模拟常规浏览器请求头,降低被反爬拦截的概率 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }) # 第一步:访问免责声明页,获取初始会话Cookie disclaimer_url = "https://umm.gassco.no/disclaimer" session.get(disclaimer_url) # 第二步:以匹配的请求方法提交接受免责声明的操作,完成授权 accept_url = "https://umm.gassco.no/disclaimer/acceptDisclaimer" # 注意:如果实际抓包发现该接口是GET方法,直接把post改成get即可 session.post(accept_url) # 第三步:同会话下访问实际带数据的业务页面(替换为你实际观察到的带表格的页面路径) data_page_url = "https://umm.gassco.no/" data_resp = session.get(data_page_url) # 定位带msgTable类的表格并转换为DataFrame gasscoflow = pd.read_html(data_resp.text, attrs={"class": "msgTable"}) Table0 = pd.DataFrame(gasscoflow[0]) Table1 = pd.DataFrame(gasscoflow[1]) Table2 = pd.DataFrame(gasscoflow[2]) Table3 = pd.DataFrame(gasscoflow[3]) Table4 = pd.DataFrame(gasscoflow[4])
调试关键注意点
- 不要手动拼接、传递Cookie:会话实例会自动按照域名规则管理所有Cookie,手动传参反而容易漏带服务端后续设置的授权标识。
- 对齐浏览器实际请求逻辑:打开开发者工具的网络面板,核对
acceptDisclaimer接口的请求方法、参数,不要靠猜测写代码。 - 确认真实数据页路径:接受完免责声明后,浏览器实际跳转的带实时数据的页面才是需要解析的目标,不要把授权接口的返回值当数据页。
- 若遇到跳转拦截,确认会话的
allow_redirects参数为默认开启状态,让客户端自动走完跳转链路,拿到最终的授权Cookie。
内容的提问来源于stack exchange,提问作者hey_arnold
相关产品推荐
相关产品推荐

