使用Python抓取Wunderground网站小时预报表格失败的问题求助
解决Wunderground小时预报页面动态内容抓取问题
你观察得太到位了!这个页面的hourly-forecast-table表格是JavaScript动态渲染生成的,这就是为什么你用requests拿不到它的原因——requests只能获取服务器返回的初始静态HTML,而浏览器里看到的表格是页面加载后,通过JS异步拉取数据再渲染出来的,所以静态源码里根本找不到这个表格,自然用XPath或者BeautifulSoup抓不到。
可行的解决办法
方法一:用浏览器自动化工具模拟加载(Selenium)
这种方法模拟真实浏览器的整个加载流程,能完整渲染出动态生成的内容,适合快速解决问题。
首先得安装依赖:
pip install selenium
还要对应安装浏览器驱动(比如ChromeDriver,要和你的Chrome版本匹配)。
示例代码:
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 import pandas as pd # 初始化Chrome浏览器(如果驱动不在系统PATH里,需要指定executable_path参数) driver = webdriver.Chrome() target_url = 'https://www.wunderground.com/hourly/es/barcelona/IBARCE215/date/2022-07-25' driver.get(target_url) # 等待表格加载完成(最多等10秒,避免网络延迟导致找不到元素) wait = WebDriverWait(driver, 10) table_element = wait.until(EC.presence_of_element_located((By.ID, 'hourly-forecast-table'))) # 直接把表格转成DataFrame,省去手动解析的麻烦 forecast_df = pd.read_html(table_element.get_attribute('outerHTML'))[0] # 用完浏览器记得关闭 driver.quit() # 查看抓取结果 print(forecast_df.head())
方法二:直接抓取后端API接口(更高效)
浏览器渲染页面时一定会调用后端API获取数据,我们可以通过开发者工具找到这个接口,直接请求它拿到结构化的JSON数据,比模拟浏览器更快、更稳定。
操作步骤:
- 打开Chrome开发者工具(快捷键F12),切换到「网络」面板
- 刷新目标页面,在XHR/fetch类型的请求里,找包含小时预报数据的接口(通常URL里会有
forecast、hourly这类关键词) - 复制这个接口的URL,检查请求头里的参数(比如是否需要特定的User-Agent),然后用
requests直接请求
示例代码(这里的API URL是假设的,你需要自己抓包得到真实接口):
import requests import pandas as pd # 替换成你抓包得到的真实API地址 api_url = "https://api.wunderground.com/api/your-api-key/hourly10day/q/IBARCE215.json" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) data = response.json() # 提取小时预报数据并转为DataFrame hourly_forecasts = data['hourly_forecast'] forecast_df = pd.DataFrame(hourly_forecasts) print(forecast_df.head())
注意:部分API可能有请求频率限制或者需要认证,你需要根据抓包到的请求信息调整参数。
为啥之前的方法在其他网站能用?
你提到的那些网站(比如worldometers、pokemondb)的表格是直接在服务器生成好,放到静态HTML里返回的,所以requests拿到的源码里就有完整的表格结构,自然用XPath或BeautifulSoup就能直接抓取到~
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

