Python网页爬取问题:返回空值,请求协助获取比特币价格
解决CoinMarketCap比特币价格爬取返回空值的问题
嘿,刚入门Python爬虫遇到这种问题太正常了,别慌!你的代码返回空值主要是两个原因:目标网站的页面结构已经更新,你用的那串冗长CSS选择器完全匹配不上现在的元素;另外直接裸请求可能被网站的反爬机制拦截,拿到的不是完整页面内容。下面一步步帮你搞定:
问题拆解
- 旧选择器失效:CoinMarketCap的页面结构经常迭代,你写的
html.js.video.videoautoplay body div.container...a.price这种链式层级选择器太依赖旧的DOM结构,现在根本找不到对应的元素。 - 反爬拦截:直接用
requests.get()发起请求,很容易被识别为爬虫,返回的内容可能是不完整的页面或者反爬提示,自然解析不到数据。
修正后的代码方案
试试下面的代码,我已经适配了当前(2024年)的页面结构,还加了基础的反爬处理:
import bs4 import requests # 模拟真实浏览器的请求头,避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } url = 'https://coinmarketcap.com/' res = requests.get(url, headers=headers) # 先检查请求是否成功,排除网络或反爬问题 if res.status_code != 200: print(f"请求失败,状态码:{res.status_code}") else: soup = bs4.BeautifulSoup(res.text, 'html.parser') # 用更稳定的属性定位比特币卡片,再提取价格 btc_card = soup.find('div', {'data-symbol': 'BTC'}) if btc_card: btc_price = btc_card.find('span', class_='sc-a0353bbc-0 jxpCgO').text print(f"当前比特币价格:{btc_price}") else: print("未找到价格元素,可能页面结构又更新了")
关键知识点说明
- 请求头(User-Agent):模拟真实浏览器的请求标识,避免被网站直接判定为爬虫拦截。
- 简化定位逻辑:用
data-symbol="BTC"直接定位比特币的卡片模块,再从中找价格元素,比链式层级选择器更稳定,就算页面小幅度更新也不容易失效。 - 状态码检查:先确认请求是否成功,能快速排除网络问题或反爬导致的页面获取失败。
如果之后页面又更新了,你可以用浏览器的开发者工具(按F12)来查看新的元素结构:右键价格区域→检查,就能看到最新的元素类名或属性,然后调整代码里的选择器就行。
内容的提问来源于stack exchange,提问作者Holmes
相关产品推荐
相关产品推荐

