尝试爬取Yahoo Finance标普500数据遭限制,求解决方案
解决Yahoo Finance标普500历史数据爬取限制的方法
模拟真实浏览器请求
Yahoo的反爬机制会识别非浏览器请求,给请求头加上真实的用户代理、语言偏好等参数,伪装成正常用户访问。示例代码:import requests 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', 'Accept-Language': 'en-US,en;q=0.9' } url = 'https://finance.yahoo.com/quote/%5EGSPC/history/?period1=1574074965&period2=1731927744' response = requests.get(url, headers=headers)还可以加上Referer字段,模拟从Yahoo首页跳转的请求,进一步降低被拦截概率。
用第三方合规库直接调用
自己写爬虫容易踩反爬坑,不如用封装好的专业库,这些库已内置反爬处理逻辑:- 使用
yfinance(当前最活跃的Yahoo Finance数据获取工具):import yfinance as yf sp500 = yf.Ticker("^GSPC") # 获取近5年数据,也可指定start/end日期精准获取 hist_data = sp500.history(period="5y") - 或者
pandas-datareader(适配pandas的数据分析场景):import pandas_datareader as pdr hist_data = pdr.get_data_yahoo('^GSPC', start='2019-11-18', end='2024-11-18')
- 使用
维持会话与Cookie
Yahoo会通过会话Cookie验证用户合法性,用requests.Session()维持会话,先访问首页获取Cookie,再请求数据页面:import requests session = requests.Session() # 先访问首页获取会话Cookie session.get('https://finance.yahoo.com') 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'} response = session.get(url, headers=headers)控制请求频率
短时间内频繁请求会触发反爬,每次请求后加1-3秒延迟:import time time.sleep(2) # 请求间隔2秒直接调用内部API接口
打开浏览器开发者工具(F12)切换到「网络」标签,刷新数据页面,找到返回JSON格式数据的XHR请求(通常含history关键字),复制该请求的URL、请求头和参数直接调用,比解析HTML更高效,也更难被拦截。
内容的提问来源于stack exchange,提问作者jumbo
相关产品推荐
相关产品推荐

