爬取谷歌加密货币价格时遇AttributeError: 'NoneType'无'find'属性错误
解决谷歌搜索加密货币汇率爬取失败的问题
你的代码出现错误主要有两个核心原因:
- 谷歌搜索页面的CSS类名是动态生成的,会不定期更新,硬编码
card-section PZPZlf、pclqee这类类名,大概率会出现找不到元素的情况 - 未设置请求头模拟浏览器,谷歌会识别出爬虫身份,返回的页面内容和浏览器看到的不一致
修改后的代码
from bs4 import BeautifulSoup import requests def cryptoPrice(crypto): url = f"https://www.google.com/search?q={crypto}+price" # 模拟浏览器请求头,可替换成你自己浏览器的User-Agent headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } req = requests.get(url, headers=headers) req.raise_for_status() # 主动抛出请求错误 soupObject = BeautifulSoup(req.text, 'html.parser') # 优先找带有data-value属性的span(谷歌价格模块常用这个属性存储数值) price_element = soupObject.find("span", {"data-value": True}) if not price_element: # 备选方案:通过价格文本特征定位 price_element = soupObject.find("span", string=lambda text: text and "$" in text) return price_element.text if price_element else "无法获取价格" price = cryptoPrice('bitcoin') print(price)
关键优化点
- 请求头模拟:通过
User-Agent让请求伪装成浏览器访问,避免被谷歌反爬拦截 - 稳定元素定位:放弃依赖动态类名,改用
data-value属性或价格文本特征定位元素,适配谷歌页面更新 - 异常处理:添加
req.raise_for_status()捕获请求错误,同时判断元素是否存在,避免直接抛出AttributeError
内容的提问来源于stack exchange,提问作者Virat Chauhan
相关产品推荐
相关产品推荐

