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

