You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用count/offset参数爬雅虎财经加密货币代码分页失效求解

结论

仅使用你当前引入的requests、BeautifulSoup、pandas三个库完全可以实现雅虎财经加密货币列表的分页爬取,原代码无法拿到预期结果不是依赖库不足导致的,是请求逻辑和代码写法存在问题。

原代码失效的核心原因
  • 缺失合法请求头:requests默认的请求标识会被雅虎财经的反爬机制识别拦截,直接发起GET请求拿到的不是完整的分页列表HTML,可能是验证页、空内容页或者仅返回首屏部分数据,自然无法遍历到不同offset对应的分页内容。
  • 循环变量冲突:外层分页循环、内层条目遍历循环都使用了i作为变量名,会出现变量覆盖问题,干扰循环逻辑。
  • 硬编码索引风险:代码固定循环25次取对应下标的元素,一旦某一页返回的条目数不足25(比如最后一页),会直接触发索引越界报错,中断整个爬取流程。
修正后的可运行代码
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

list_ticker = []
# 配置基础请求头,模拟正常浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

for page_num in range(8):
    offset = page_num * 25
    url = f'https://finance.yahoo.com/cryptocurrencies?count=25&offset={offset}'
    resp = requests.get(url, headers=headers)
    # 校验请求状态,请求失败直接抛出异常避免无效解析
    resp.raise_for_status()
    soup = bs(resp.text, "html.parser")
    # 提取当前页所有ticker对应的a标签,不硬编码条目数量
    ticker_elements = soup.find_all('a', {'class': 'Fw(600) C($linkColor)'})
    for elem in ticker_elements:
        ticker = elem.text.strip()
        if ticker:
            list_ticker.append(ticker)

# 可直接用pandas转为结构化数据
ticker_df = pd.DataFrame(list_ticker, columns=["ticker"])
# 按需导出为文件
# ticker_df.to_csv("yahoo_crypto_tickers.csv", index=False)
print(f"爬取完成,共获取{len(list_ticker)}个加密货币交易代码")
补充说明
  • 如果爬取过程中出现偶发的请求拦截,可以在每次分页请求之间加入1~2秒的访问延时,导入标准库time后调用time.sleep(1.5)即可,降低请求频率避免被临时限制访问。
  • 若后续运行时出现提取不到元素的情况,优先检查目标a标签的class属性是否随雅虎财经前端版本更新发生了变化,更新选择器即可恢复。
  • 你原本设计的通过修改URL中count、offset参数遍历分页的逻辑是完全正确的,不需要调整分页规则。

内容的提问来源于stack exchange,提问作者Nicolas Zimnovitch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:09:57