You need to enable JavaScript to run this app. Python BS4爬取Weather Underground预报时查找obs-date返回空问题
优惠活动
大模型
产品
解决方案
定价
更多

Python BS4爬取Weather Underground预报时查找obs-date返回空问题

Weather Underground 预报数据爬取返回空列表问题排查

实际问题场景

  • 过往爬取Weather Underground平台天气数据时,常规目标字段均可正常获取
  • 当前需抓取的预报字段包括星期/日期、最高/最低气温、预报描述文本(如“局部多云”),上述字段的承载标签为无class属性的div,其直接父元素为class值为obs-date的div
  • 运行抓取逻辑时,所有针对obs-date父元素的查找方案均返回空列表,无法定位到目标内容

实际运行代码

def get_wx(city, state):
    city = city.lower()
    state = state.lower()
    
    # 调用已有逻辑获取当前观测数据
    current_dict = get_current(city, state)

    # 构造预报页请求
    f_url = f'https://www.wunderground.com/forecast/us/{state}/{city}'
    f_response = req.get(f_url)
    f_soup = BeautifulSoup(f_response.text, 'html.parser')
    cast_dates = f_soup.find_all('div', class_="obs-date")
    # 已尝试的备选实现方案(均返回空)
    # cast_dates = f_soup.find_all('div', attrs={"class":"obs-date"})
    # cast_dates = f_soup.select('div.obs-date')
    print(cast_dates)

# 调用测试
get_wx("Portland", "ME")

核心问题原因

  • 该站点预报页为前后端分离架构,通过普通requests请求拿到的初始HTML源码,本身不包含obs-date对应的DOM节点,这类节点是页面加载完成后由前端JavaScript动态渲染生成的,静态解析自然无法匹配到对应元素
  • 站点存在基础反爬校验,未携带合规请求头的普通请求,返回的是简化的拦截提示页,不存在真实的预报区块DOM结构

可行解决方向

  • 替换静态请求方案,使用支持JS渲染的抓取工具(如Playwright、Selenium)等待页面完全加载完成后,再提取DOM元素做解析
  • 直接定位站点前端调用的后端预报数据接口,绕过页面渲染流程直接请求接口获取结构化JSON数据,提升抓取效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:45:07