从Yahoo Finance爬取昨日财报异常:获周日而非周五数据
问题排查步骤
1. 修复日期变量初始化错误
你的代码里today = today.date()属于语法错误——today变量未定义就调用方法,正确写法应为:
today = date.today()
这一步不修复的话代码无法正常运行,推测你实际运行的代码存在笔误,但这个错误会直接导致后续日期计算完全偏离预期。
2. 验证日期参数的格式与有效性
Yahoo Finance财报日历的日期参数要求为YYYY-MM-DD格式,虽然Pythondate对象转字符串默认符合该格式,但仍需确认两点:
- 当今天是周日时,
today - timedelta(days=2)是否确实得到上周五的日期 - 手动拼接URL后在浏览器中打开,确认页面显示的是目标日期的财报数据,而非自动跳转到其他日期
比如今天是2024-05-19(周日),计算得到的目标日期应为2024-05-17(周五),打开对应URL后若页面自动跳转到周日内容,说明Yahoo Finance日历逻辑会自动调整到最近有财报发布的日期,此时需确认目标日期是否有财报发布记录。
3. 添加请求头模拟浏览器请求
Yahoo Finance会对无请求头的爬虫请求做限制,返回内容可能并非预期页面。需给requests.get添加User-Agent:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36' } page = requests.get(url, headers=headers)
无请求头时,服务器可能返回默认页面内容(如当前日期),而非你指定日期的财报数据。
4. 检查元素定位的准确性
Fw(600) C($linkColor)类名对应的链接并非仅属于目标日期的财报条目,页面可能默认显示其他日期的内容。可以先打印soup.prettify()查看返回的HTML结构,确认页面是否包含目标日期的财报数据,再调整元素选择器:
table = soup.find('table', 'W(100%)') if table: rows = table.find_all('tr') for row in rows[1:]: # 跳过表头行 ticker = row.find('a', 'Fw(600) C($linkColor)') if ticker: print(ticker.text)
通过遍历表格行,可查看页面中所有股票代码,确认是否为目标日期的内容。
内容的提问来源于stack exchange,提问作者x945
相关产品推荐
相关产品推荐

