如何用Python的requests库模拟浏览器?下载文件遭拒问题排查
问题分析与解决方法
核心问题排查
你遇到的「请求的URL被拒绝」主要源于请求头配置错误:
- Host字段不匹配:你从httpbin获取的headers里Host是
httpbin.org,但目标站点域名是open.data.gov.sa,服务器会因域名不匹配直接拒绝请求。 - 冗余字段干扰:
X-Amzn-Trace-Id是httpbin的专属追踪标识,对目标站点无意义,反而可能触发反爬机制。 - Accept头适配不足:当前Accept头偏向HTML页面,下载文件时需要调整为支持对应格式(如CSV、XLSX)。
修正后的代码
以下是可正常下载CSV和XLSX文件的代码:
import requests # 目标文件链接,替换后缀即可切换CSV/XLSX格式 csv_link = "https://open.data.gov.sa/odp-public/61ebb13c-d3b3-4cee-8edd-0f0d71923d9a/d79e9bfc-ae6b-4504-84cb-e6010d88aebd/v1/Tabuk University graduates intermediate diploma.csv" xlsx_link = "https://open.data.gov.sa/odp-public/61ebb13c-d3b3-4cee-8edd-0f0d71923d9a/d79e9bfc-ae6b-4504-84cb-e6010d88aebd/v1/Tabuk University graduates intermediate diploma.xlsx" # 适配目标站点的请求头 headers = { "Accept": "text/csv,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "sv-SE,sv;q=0.9", "Host": "open.data.gov.sa", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15" } def download_file(url, save_path): session = requests.Session() session.headers.update(headers) # 流式下载避免大文件占用过多内存 with session.get(url, stream=True) as response: response.raise_for_status() # 主动抛出请求异常 with open(save_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"文件已保存至: {save_path}") # 下载CSV文件 download_file(csv_link, "graduates.csv") # 下载XLSX文件 download_file(xlsx_link, "graduates.xlsx")
额外说明
- 切换文件格式仅需修改链接后缀(
.csv改为.xlsx),目标站点会自动返回对应格式文件。 stream=True采用流式下载,适合处理较大文件,避免内存溢出。response.raise_for_status()会在请求失败时抛出异常,便于快速定位问题。
内容的提问来源于stack exchange,提问作者SheperoMah
相关产品推荐
相关产品推荐

