如何从下载链接直接读取CSV到pandas DataFrame?遇403错误求解
解决远程CSV读取的403 Forbidden错误
问题根源
目标网站的服务器会校验请求的来源标识,直接用pd.read_csv()或无请求头的requests发起请求,会被判定为非浏览器请求,进而返回403禁止访问。
可行解决方法
方式一:pandas直接带请求头读取(需pandas 1.3.0及以上版本)
import pandas as pd url = 'https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/download/train-file' # 模拟浏览器的请求头 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' } # 通过storage_options参数传递请求头 df = pd.read_csv(url, storage_options={'User-Agent': headers['User-Agent']})
方式二:结合requests+pandas读取
import requests import pandas as pd from io import StringIO url = 'https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/download/train-file' 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' } # 发起带请求头的请求 response = requests.get(url, headers=headers) # 检查请求是否成功,失败则抛出异常 response.raise_for_status() # 将响应内容转为StringIO,再用pandas读取 df = pd.read_csv(StringIO(response.text))
额外提示
- 你可以替换User-Agent为自己浏览器的真实标识,在浏览器F12开发者工具的网络请求详情中能找到
- 如果还是出现403,可以尝试添加
Referer请求头,值设为目标网站的下载页面地址,进一步模拟完整的浏览器请求
内容的提问来源于stack exchange,提问作者leemichaelwaters
相关产品推荐
相关产品推荐

