如何用Python/BeautifulSoup提取德国气象局(DWD)网站HTML中的时间戳?
解决DWD预警页面时间戳无法抓取的问题
问题根源
你看到的时间戳是通过JavaScript动态渲染到页面上的,requests库只能获取服务器返回的静态初始HTML,不会执行页面中的JS代码,所以自然拿不到动态生成的时间戳内容。
可行解决方案
方案1:使用支持JS渲染的工具(如Selenium)
模拟真实浏览器加载页面,等待JS执行完成后再提取元素。
安装依赖:
pip install selenium
同时需要对应浏览器的驱动(树莓派可使用Chromium Driver)。
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://www.dwd.de/DE/wetter/warnungen_gemeinden/warnWetter_node.html?ort=Berlin-Mitte" # 树莓派推荐用headless模式节省资源 options = webdriver.ChromeOptions() options.add_argument('--headless=new') driver = webdriver.Chrome(options=options) try: driver.get(url) # 等待headerBox元素加载完成,最多等待10秒 header_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "headerBox")) ) # 提取包含时间戳的完整文本 full_update_text = header_box.text print(full_update_text) finally: driver.quit()
方案2:直接调用DWD官方API(更推荐)
爬取页面容易受页面结构变更影响,官方API是更稳定的数据源。DWD提供了预警相关的JSON API,可直接请求获取包含时间戳的结构化数据。
示例代码:
import requests # 请求DWD预警数据API api_url = "https://www.dwd.de/DWD/warnungen/warnapp/json/warnings.json" response = requests.get(api_url) data = response.json() # 筛选柏林-Mitte的预警数据 for region in data['warnings']: if region['regionName'] == 'Berlin-Mitte': print(f"最后更新时间: {region['timestamp']}") print(f"预警内容: {region['description']}") break
注:API端点可能会更新,可通过浏览器开发者工具的Network面板,抓取页面加载时的真实API请求地址。
树莓派适配提示
- 使用Selenium时,建议安装轻量浏览器(如Chromium)及对应驱动,降低资源占用。
- 可通过
crontab设置定时任务,定期检查预警并触发邮件发送逻辑。
内容的提问来源于stack exchange,提问作者Craven
相关产品推荐
相关产品推荐

