浏览器可打开链接但Python requests请求返回404的非Selenium解决方案
解决Tableau CSV下载请求404的问题
直接用你提供的URL发起requests请求返回404,是因为Tableau公共站点对请求的完整性有校验,仅User-Agent不够。可以通过补充关键请求头、确保重定向正常来解决,不用Selenium:
- 补充
Referer头:告诉服务器请求来自对应仪表板页面,模拟浏览器的访问上下文 - 补充
Accept头:明确接受CSV格式的响应 - 确保requests自动处理重定向(默认已开启,可显式指定强化)
修改后的代码:
import requests import pandas as pd url = 'https://public.tableau.com/app/profile/damian3851/viz/IATAdemandgrowth/IATAMonthlyCargoStatistics.csv' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36', 'Referer': 'https://public.tableau.com/app/profile/damian3851/viz/IATAdemandgrowth/IATAMonthlyCargoStatistics', 'Accept': 'text/csv,application/vnd.ms-excel,application/json,text/plain,*/*' } # 发起请求并允许重定向 response = requests.get(url, headers=headers, allow_redirects=True) # 处理响应 if response.status_code == 200: # 保存到本地文件 with open('IATAMonthlyCargoStatistics.csv', 'wb') as f: f.write(response.content) # 或直接用pandas读取数据 df = pd.read_csv(pd.io.common.StringIO(response.text)) print(df.head()) else: print(f"请求失败,状态码: {response.status_code}")
原理说明
Tableau的公共下载链接会验证请求是否来自对应的仪表板页面,Referer头是关键校验项。同时,明确Accept头能让服务器正确返回CSV格式内容,避免返回错误页面。如果仍有问题,可以抓包浏览器访问时的完整请求头,将所有非动态生成的头字段都添加到requests请求中,基本就能绕过拦截。
内容的提问来源于stack exchange,提问作者just_learning
相关产品推荐
相关产品推荐

