能否从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
相关产品推荐
相关产品推荐

