使用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
相关产品推荐
相关产品推荐

