如何使用Python的Beautiful Soup定位爬取到的真实天气数据?
问题解决说明
你当前的代码有三个核心问题导致无法稳定获取到正确的天气数据:
- 未配置请求头UA,站点大概率识别到爬虫请求,返回的HTML和浏览器正常访问的DOM结构不一致
- 用了站点自动生成的带哈希后缀的动态类名定位元素,这类类名会随站点版本更新频繁变更,完全不可靠
- 直接将元素对象转字符串后按固定索引切片取内容,DOM结构稍有变动就会拿到错误文本
修正后的代码实现
import requests from bs4 import BeautifulSoup from win10toast import ToastNotifier n = ToastNotifier() def getdata(url): # 配置模拟浏览器的请求头,避免被反爬拦截 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" } r = requests.get(url, headers=headers) r.encoding = r.apparent_encoding return r.text htmldata = getdata("https://weather.com/en-IN/weather/today/l/cbaac1d32c1c53fb17b70538d11fb0f7a9b126f58b9515261d847f28c846d32c") soup = BeautifulSoup(htmldata, 'html.parser') # 用稳定的data-testid属性定位,比动态类名可靠得多 current_temp_ele = soup.find("span", {"data-testid": "TemperatureValue"}) chances_rain_ele = soup.find("span", {"data-testid": "PrecipitationProbabilityValue"}) # 先判断元素是否成功获取,避免空值报错 if current_temp_ele and chances_rain_ele: current_temp = current_temp_ele.text chances_rain = chances_rain_ele.text result = f"当前城市气温:{current_temp}\n降水概率:{chances_rain}" n.show_toast("实时天气更新", result, duration = 15) else: print("天气数据获取失败,请检查页面结构是否变更") input()
后续优化建议
- 可以定位页面内的城市名称元素,替换掉固定的城市文本,让通知内容更准确
- 可以增加异常捕获逻辑,处理网络请求失败、元素不存在等异常场景
- 如果后续该站点结构频繁变更导致爬虫失效,可以换成公开的天气接口获取数据,稳定性远高于爬虫
内容的提问来源于stack exchange,提问作者shadowsmith14
相关产品推荐
相关产品推荐

