You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从FAA气象摄像头网站下载照片?Python爬虫求助

解决FAA气象摄像头爬取问题的建议

1. 修复Selenium代码的基础问题

你代码里用了find_elements_by_xpath(复数形式),返回的是元素列表,直接调用.click()会报错。应该用find_element_by_xpath(单数),或者从列表中取对应元素。另外绝对XPath非常脆弱,页面结构稍有变化就会失效,建议改用相对XPath或其他定位方式。

修正后的基础代码:

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

driver = webdriver.Edge()
driver.get('https://weathercams.faa.gov/cameras/state/US')

# 等待元素加载完成,用相对XPath定位第一个机场链接
wait = WebDriverWait(driver, 10)
airport_link = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'camera-list-item')]/a")))
airport_link.click()

2. 处理动态加载与页面等待

网站内容是动态渲染的,直接获取元素会因未加载完成返回None,必须使用显式等待(上述代码中的WebDriverWait),等待元素出现后再操作,而非直接调用查找方法。

3. 遍历所有机场并保存图片的实现思路

  • 获取所有机场链接:先抓取当前页的机场链接,注意页面可能存在分页,需处理“下一页”点击逻辑直到无更多内容
  • 进入机场页面提取图片:对每个机场链接,跳转后找到摄像头图片元素,提取src属性
  • 下载图片到本地:用requests库下载图片,比Selenium直接保存效率更高

示例遍历框架:

import requests
import os

# 创建图片保存目录
if not os.path.exists('faa_weather_cams'):
    os.makedirs('faa_weather_cams')

# 循环处理分页(示例仅处理当前页,需自行补充分页逻辑)
while True:
    # 获取当前页所有机场链接
    airport_links = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 'camera-list-item')]/a")))
    for link in airport_links:
        # 直接通过链接跳转,避免点击后的页面切换问题
        driver.get(link.get_attribute('href'))
        
        # 获取当前机场的所有摄像头图片
        cam_imgs = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//img[contains(@class, 'camera-image')]")))
        for idx, img in enumerate(cam_imgs):
            img_url = img.get_attribute('src')
            # 下载图片
            img_data = requests.get(img_url).content
            # 用机场名称+序号命名图片
            airport_name = driver.find_element(By.TAG_NAME, 'h1').text.strip()
            with open(f'faa_weather_cams/{airport_name}_{idx+1}.jpg', 'wb') as f:
                f.write(img_data)
        
        # 返回上一页继续处理
        driver.back()
    
    # 尝试点击下一页,无则退出循环
    try:
        next_page = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Next')]")))
        next_page.click()
    except:
        break

4. 更高效的替代方案:直接调用API接口

无需使用Selenium,可通过浏览器开发者工具(F12)抓包,找到网站加载机场列表和摄像头数据的API接口,直接用requests请求接口获取JSON格式数据,提取图片URL后下载,效率远高于模拟浏览器操作。

注意事项

  • 爬取时需遵守网站robots.txt规则,添加请求间隔避免IP被封禁
  • 可设置User-Agent请求头模拟浏览器访问
  • 需处理异常情况,比如图片链接失效、页面加载超时等

内容的提问来源于stack exchange,提问作者Mitchell Nelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:45:31