谷歌风速网页爬虫出现AttributeError: 'NoneType' object has no attribute 'text'错误的排查与修复
AttributeError: 'NoneType' object has no attribute 'text' when scraping Google wind speed data
这种问题在网页爬取里真的太常见了,我来帮你拆解原因和解决办法:
为什么代码突然失效了?
你遇到的AttributeError本质是因为soup.find("span", attrs={"id": "wob_ws"})返回了None——也就是说,当前爬取到的页面里根本找不到这个ID为wob_ws的span元素。核心原因有两个:
- Google更新了页面结构:网页的DOM元素ID、class或层级经常会变动,几周前有效的选择器,现在大概率被替换了。Google的天气页面尤其喜欢做这类调整。
- 触发了反爬机制:如果你的请求头不够"像真实用户",Google可能会返回带人机验证的页面,或者不完整的内容,自然找不到你要的风速元素。
如何修改代码恢复功能?
我给你调整了代码,增加了容错机制、更真实的请求头,还加了调试手段:
import requests from bs4 import BeautifulSoup as bs def current_windspeed(url): # 使用更贴近现代浏览器的请求头 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" LANGUAGE = "en-UK,en;q=0.9" session = requests.Session() session.headers.update({ 'User-Agent': USER_AGENT, 'Accept-Language': LANGUAGE, 'Content-Language': LANGUAGE, 'Referer': 'https://www.google.com/', # 模拟从谷歌主页跳转 'DNT': '1' # 告诉服务器不要跟踪请求,更符合真实用户习惯 }) try: # 增加超时限制,避免请求挂起 html = session.get(url, timeout=10) # 检查请求是否成功(比如403禁止访问、500服务器错误) html.raise_for_status() soup = bs(html.text, "html.parser") # 先尝试原选择器 wind_element = soup.find("span", attrs={"id": "wob_ws"}) # 如果找不到,尝试查找可能的新选择器(需要你自己验证最新元素) if not wind_element: # 举个例子,假设现在风速元素的class是"wob-ws",你要实际去浏览器确认 wind_element = soup.find("span", class_="wob-ws") # 如果还是找不到,保存页面到本地方便调试 if not wind_element: with open("google_weather_debug.html", "w", encoding="utf-8") as f: f.write(html.text) print("⚠️ 无法找到风速元素,页面已保存到google_weather_debug.html,请检查页面结构") return None # 整理结果,去除多余空格 current_weather = {'wind': wind_element.text.strip()} return current_weather except requests.exceptions.RequestException as e: print(f"❌ 请求出错: {str(e)}") return None
关键修改点说明:
- 优化请求头:更新了User-Agent为最新Chrome版本,添加Referer和DNT字段,降低被反爬拦截的概率
- 异常处理:捕获请求过程中的各种错误(超时、403等),避免程序直接崩溃
- 容错查找:找不到原ID时尝试备选选择器,还能自动保存页面到本地,方便你分析最新页面结构
- 结果清洗:用
strip()去除风速文本前后的空格,让返回结果更整洁
额外调试建议:
- 手动验证页面结构:打开浏览器访问你爬取的Google天气URL,按F12打开开发者工具,用"元素选择器"点击风速数值,查看它现在的ID、class或父元素结构,把新选择器替换到代码里
- 检查反爬情况:打开保存的
google_weather_debug.html,如果里面是人机验证页面,说明你需要进一步优化请求头,甚至考虑使用代理IP或增加请求延迟
内容的提问来源于stack exchange,提问作者Aura
相关产品推荐
相关产品推荐

