Selenium Python下载单张及批量图片至指定目录的方法咨询
Selenium Python下载单张及批量图片至指定目录的方法咨询
嘿,这个需求我之前做过好几次,其实流程挺清晰的,我给你一步步拆解,附上代码示例,你可以直接参考调整:
一、前期准备
首先得确保你装了需要的库,没装的话先跑这两个命令:pip install seleniumpip install requests
另外记得下载对应浏览器的驱动(比如ChromeDriver),要么配置到环境变量里,要么初始化浏览器时直接指定驱动路径。
二、核心步骤及代码示例
1. 先搞定保存目录
首先定义你要存图片的目录,比如./my_downloaded_images,然后判断这个目录是否存在,不存在就自动创建:
import os # 指定保存图片的目录 save_directory = "./my_downloaded_images" # 如果目录不存在则创建 if not os.path.exists(save_directory): os.makedirs(save_directory)
2. 用Selenium爬取并下载图片
接下来启动浏览器访问目标网页,获取所有图片元素,然后逐个下载到指定目录。这里要注意处理相对路径、请求异常这些小细节:
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 requests from urllib.parse import urljoin # 初始化Chrome浏览器(换成Firefox等也可以,对应改webdriver就行) driver = webdriver.Chrome() driver.get("替换成你的目标网页URL") # 等待页面加载出图片元素(避免还没加载完就去获取,可选,根据网页情况调整等待时间) wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, "img"))) # 获取页面上所有img元素 all_images = driver.find_elements(By.TAG_NAME, "img") # 遍历每个图片元素,下载保存 for index, img_element in enumerate(all_images): try: # 获取图片的src属性 img_src = img_element.get_attribute("src") if not img_src: continue # 跳过没有src的无效图片 # 处理相对路径,转换成完整的绝对URL full_img_url = urljoin(driver.current_url, img_src) # 请求图片内容,加stream=True适合下载大文件 response = requests.get(full_img_url, stream=True) response.raise_for_status() # 如果请求失败直接抛出异常 # 生成保存的文件名,这里用序号+原后缀,你也可以自定义命名规则 img_extension = full_img_url.split('.')[-1].split('?')[0] # 处理带参数的URL save_filename = f"pic_{index + 1}.{img_extension}" save_path = os.path.join(save_directory, save_filename) # 写入文件到指定目录 with open(save_path, "wb") as file: for chunk in response.iter_content(chunk_size=8192): file.write(chunk) print(f"成功下载:{save_path}") except Exception as e: print(f"下载失败,错误原因:{str(e)}") # 最后记得关闭浏览器 driver.quit()
三、实用补充技巧
- 处理动态加载图片:如果网页是滚动才加载新图片的,你可以加一段滚动页面的逻辑,确保所有图片都加载出来:
# 示例:循环滚动页面加载所有图片 last_scroll_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载 driver.implicitly_wait(3) # 对比新的滚动高度,判断是否加载完 new_scroll_height = driver.execute_script("return document.body.scrollHeight") if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height
- 规避反爬:有些网站会拦截非浏览器请求,你可以给requests加个模拟浏览器的请求头:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(full_img_url, stream=True, headers=headers)
- 避免文件名重复:如果担心文件名重复覆盖,你可以用UUID生成唯一文件名,或者对原URL做哈希处理。
备注:内容来源于stack exchange,提问作者Callum
相关产品推荐
相关产品推荐

