使用Requests+BeautifulSoup无第三方API抓取雅虎财经成交量数据问题排查
错误原因及修复方案
核心问题点
- 反爬拦截:雅虎财经对未携带浏览器标识的请求会直接返回拦截页面,你使用requests默认UA发起请求,拿到的并非正常的个股数据页,自然无法匹配到对应元素。
- URL参数错误:代码中请求的URL参数为
p=EDTK,和你预期抓取的AMZN个股目标页面不符,请求路径本身就存在错误。 - 可选优化:依赖完整动态class名匹配稳定性极低,雅虎财经前端样式类名会随版本迭代调整,用文本特征定位目标字段容错性更高。
修复后可运行代码
import requests from bs4 import BeautifulSoup # 配置请求头,模拟浏览器访问绕过基础反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 修正为AMZN个股的正确URL url = 'https://finance.yahoo.com/quote/AMZN?p=AMZN&.tsrc=fin-srch' r = requests.get(url, headers=headers) web_content = BeautifulSoup(r.text, 'lxml') # 先定位Summary表格所有行 table_rows = web_content.select('div[data-test="quote-summary"] tr') result = {} for row in table_rows: # 提取每行的标签和数值 label = row.select_one('td:first-child').get_text(strip=True) value = row.select_one('td:last-child').get_text(strip=True) # 只保留需要的两个字段 if label in ("Volume", "Avg. Volume"): result[label] = value print(result)
运行说明
代码运行后会输出类似结构的结果:{'Volume': '40,993,569', 'Avg. Volume': '48,837,879'},数值会随市场动态更新。
内容的提问来源于stack exchange,提问作者Seth Bowers
相关产品推荐
相关产品推荐

