You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌风速网页爬虫出现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元素。核心原因有两个:

  1. Google更新了页面结构:网页的DOM元素ID、class或层级经常会变动,几周前有效的选择器,现在大概率被替换了。Google的天气页面尤其喜欢做这类调整。
  2. 触发了反爬机制:如果你的请求头不够"像真实用户",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()去除风速文本前后的空格,让返回结果更整洁

额外调试建议:

  1. 手动验证页面结构:打开浏览器访问你爬取的Google天气URL,按F12打开开发者工具,用"元素选择器"点击风速数值,查看它现在的ID、class或父元素结构,把新选择器替换到代码里
  2. 检查反爬情况:打开保存的google_weather_debug.html,如果里面是人机验证页面,说明你需要进一步优化请求头,甚至考虑使用代理IP或增加请求延迟

内容的提问来源于stack exchange,提问作者Aura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:02:40