如何使用Python下载未直接指向CSV文件的链接中的CSV数据
解决myfxbook经济日历CSV无法通过requests下载的方案
问题根因
myfxbook配置了反爬校验规则,直接发起GET请求会被拦截:站点会校验请求的请求头信息、是否携带合法的会话Cookie,不符合要求的请求会直接返回空内容。
实现步骤
- 初始化requests会话,先访问经济日历首页获取合法会话Cookie
- 构造下载请求时补充模拟浏览器的请求头,避免被拦截
- 获取响应内容后可直接转为DataFrame或保存到本地
示例代码
import requests import pandas as pd from io import StringIO # 初始化会话,统一管理请求头和Cookie session = requests.Session() # 可替换为自己浏览器的实际User-Agent,降低被拦截概率 headers = { "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", "Referer": "https://www.myfxbook.com/economic-calendar", "Accept": "text/csv,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" } session.headers.update(headers) # 先访问经济日历首页,生成合法会话 session.get("https://www.myfxbook.com/economic-calendar") # 替换为你自己构造的CSV下载链接 download_url = "https://www.myfxbook.com/calendar_statement.csv?filter=0-1-2-3_ANG-ARS-AUD-BRL-CAD-CHF-CLP-CNY-COP-CZK-DKK-EEK-EUR-GBP-HKD-HUF-IDR-INR-ISK-JPY-KPW-KRW-MXN-NOK-NZD-PEI-PLN-QAR-ROL-RUB-SEK-SGD-TRY-USD-ZAR&end=2021-08-20%2015:59:59.059&start=2021-08-18%2016:00:00.0&calPeriod=10" # 发起下载请求 resp = session.get(download_url) resp.encoding = "utf-8" if len(resp.content) > 0: # 直接读取为DataFrame df = pd.read_csv(StringIO(resp.text)) # 可选:保存到本地文件 with open("myfxbook_economic_calendar.csv", "wb") as f: f.write(resp.content) else: print("请求被拦截,请替换User-Agent后重试")
注意事项
- User-Agent可以通过在浏览器地址栏输入
javascript:alert(navigator.userAgent)获取自己本地浏览器的实际值,通用UA更容易被站点拦截 - 如果需要下载大时间范围的数据,建议拆分为多个小的时间区间分批请求,避免触发站点频率限制
内容的提问来源于stack exchange,提问作者moron
相关产品推荐
相关产品推荐

