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

Python爬取Coinmarketcap仅能获取前10条市值数据后续结果为None求助

问题排查与修复方案

核心原因

你遇到的前10条数据可抓取、后续数据为空的问题,本质是CoinMarketCap首页采用了懒加载策略:初始请求返回的HTML里只内置了排名前10的加密货币条目,排名10+的内容需要用户向下滚动页面时,由浏览器执行JS动态加载渲染。你使用的requests库只能获取初始静态HTML,无法执行JS加载后续内容,自然无法匹配到10名之后的节点。

现存代码的其他问题

  • 循环逻辑错误:你在i%10 == 0时执行break跳出当前循环,会直接跳过第10、20条数据的抓取逻辑,且静态请求场景下的sleep没有任何作用,无法触发页面加载新内容
  • 选择器稳定性差:你使用的bywovg-1、sc-57oli2-0这类类名是前端框架自动生成的动态类名,平台迭代时随时会变更,写死 selector 很容易后续完全失效

修复方案

改用支持JS渲染的无头浏览器工具(如Selenium、Playwright)替代requests,模拟真人滚动页面的操作,等所有条目加载完成后再提取数据即可拿到前20名的完整数据。
以下是基于Selenium的参考修改代码:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

chrome_options = Options()
chrome_options.add_argument("--headless=new") # 无头模式不弹出浏览器
driver = webdriver.Chrome(options=chrome_options)

url = 'https://coinmarketcap.com/'
driver.get(url)

# 模拟滚动页面加载20条数据
for _ in range(2):
    # 滚动到页面底部触发加载
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2) # 等待内容加载完成

soup = BeautifulSoup(driver.page_source, 'lxml')
result={}
baseAddr1 = '#__next > div.bywovg-1.sXmSU > div.main-content > div.sc-57oli2-0.comDep.cmc-body-wrapper > div > div:nth-child(1) > div.h7vnx2-1.bFzXgL > table > tbody > '
baseAddr3 = ' > td:nth-child(3) > div > a'

for i in range(1,21):
    baseAddr2 = 'tr:nth-child(' + str(i) + ')'
    Addr = baseAddr1 + baseAddr2 + baseAddr3
    data = soup.select(Addr)
    for item in data:
        result.update({item.get_text(): item.get('href')})

print(result)
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:27:03