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
相关产品推荐
相关产品推荐

