使用Selenium爬取Wunderground历史天气数据页面加载失败如何解决
问题根因排查
- 固定等待逻辑不合理:你当前使用
time.sleep(5)固定等待5秒的逻辑无法适配不同网络环境下的异步加载速度,wunderground的历史天气数据需要在基础页面加载完成后,额外通过JS请求后端接口拉取表格数据,网络波动时5秒不足以完成全量资源加载,就会出现空白、数据缺失的异常页面。 - 反爬策略触发:虽然你已经添加了隐藏自动化特征的配置,但高频访问时站点仍会识别爬虫特征,返回拦截响应或者终止后续资源加载。
- 浏览器配置缺失:缺少正常用户的浏览器特征参数,容易被站点识别为非真实用户访问。
可行解决方案
1. 替换固定等待为显式等待
使用Selenium的显式等待逻辑,直到页面核心的天气表格元素加载完成再执行后续操作,同时新增超时重试机制,代码示例:
import random from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 原有浏览器配置部分保持不变 driver = webdriver.Chrome(options=option) driver.get(url) # 替换原有的time.sleep(5) max_retry = 3 for retry_count in range(max_retry): try: # 最长等待30秒,直到天气表格加载完成 WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table[aria-label='Daily Observations']")) ) break except Exception as e: if retry_count == max_retry - 1: raise Exception(f"页面加载失败,已重试{max_retry}次") from e # 刷新页面重试 driver.refresh() time.sleep(random.randint(2,5))
2. 补充浏览器反爬配置
在原有ChromeOptions配置中新增以下参数,模拟真实用户的浏览器特征:
# 模拟真实用户UA,可定期更换不同版本的浏览器UA option.add_argument("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") # 启动时最大化窗口,匹配真实用户操作习惯 option.add_argument("--start-maximized") # 禁用沙箱模式,解决Linux环境下的加载异常问题 option.add_argument("--no-sandbox") option.add_argument("--disable-dev-shm-usage")
3. 控制访问频率
每次请求完成后添加随机停留时间,避免高频访问触发反爬规则:
# 处理完单页数据后添加 time.sleep(random.randint(3,7))
内容的提问来源于stack exchange,提问作者Brian Liu
相关产品推荐
相关产品推荐

