Python使用bs4解析CoinMarketCap表格数据失败相关问题咨询
代码无法运行的核心原因
你写的逻辑本身没有原则性错误,问题出在两点:
- CoinMarketCap的历史数据页面是前端动态渲染的,直接用
requests.get拿到的初始HTML里没有完整的表格数据,数据是浏览器加载页面后通过JS异步请求、再渲染到DOM里的,所以bs4在初始HTML里找不到你要的元素,自然返回空。 - 你第二个代码片段里混淆了
bs4的方法用法:soup.select()只接受CSS选择器字符串作为参数,不需要额外传属性字典,正确写法是soup.select('div.b4d71h-2.hgYnhQ');如果要传属性字典匹配,应该用soup.find('div', {'class': 'b4d71h-2 hgYnhQ'}),方法用错自然匹配不到结果。
疑问解答
1. 随机类名的原因和定位策略
这些无意义的类名90%以上是前端工程化工具自动生成的:现在主流的React/Vue等框架都会用CSS Modules、Tailwind等方案自动生成哈希类名,目的是避免不同组件的CSS类名冲突,并不是网站专门做的反爬措施,但客观上确实增加了DOM解析的不稳定性。
定位元素的时候优先选择以下特征,比类名稳定得多:
- 带固定前缀的自定义属性,比如你之前用到的
td[data-format-market-cap]这类data-开头的属性,基本不会随便变 - 标签的层级顺序,比如表格下的第几个tr、第几个td
- 固定文本内容的节点锚定
绝对不要用随机哈希类名作为唯一匹配条件,这类类名每次网站前端发版都会变,爬取逻辑根本没法长期用。
2. 找底层数据接口的方法
用浏览器的开发者工具就能快速找到接口,步骤很简单:
- 打开目标页面后按F12调出开发者工具,切换到「网络」面板
- 筛选面板里的「XHR/ fetch」选项,刷新页面
- 挨个看列表里的请求,点进去看「响应」标签,找返回内容是JSON格式、包含你要的日期、收盘价、交易量等数据的请求
- 拿到这个请求的URL和参数,直接用
requests请求这个接口就行,返回的都是结构化数据,不需要再解析DOM,稳定性远高于页面爬取。
可行的修正方案
如果不想找接口,可以直接用无头浏览器渲染完整页面后再解析,示例代码用Playwright实现:
import pandas as pd from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright def get_coinmarketcap_info(coin_slug, s_date, e_date): url = f"https://coinmarketcap.com/currencies/{coin_slug}/historical-data/?start={s_date}&end={e_date}" with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(url, wait_until="networkidle") # 等待表格渲染完成 page.wait_for_selector("table tbody tr") html = page.content() browser.close() soup = BeautifulSoup(html, "lxml") for items in soup.select("table tbody tr"): tds = items.select("td") if len(tds) < 6: continue date = tds[0].get_text(strip=True) close = tds[4].get_text(strip=True) volume = tds[5].get_text(strip=True) marketcap = tds[6].get_text(strip=True) yield date, close, volume, marketcap if __name__ == '__main__': dataframe = get_coinmarketcap_info('xrp', s_date='20130428', e_date='20191020') df = pd.DataFrame(dataframe, columns=["日期", "收盘价", "交易量", "市值"]) print(df)
运行前先安装依赖:pip install pandas playwright beautifulsoup4 lxml && playwright install chromium
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

