如何通过Selenium批量保存Pinterest画板中的所有图片?
Pinterest画板批量下载图片解决方案
以下是针对你无法在下载单张图片后返回画板继续处理下一张的问题,修改后的完整代码,包含批量下载的完整逻辑:
import os import time import requests from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver # 配置信息 BOARD_URL = 'https://www.pinterest.jp/aku_ma/%E3%82%A2%E3%83%8B%E3%83%A1%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3/' EMAIL = 'xxxx@gmail.com' PASSWORD = 'xxxx' DOWNLOAD_FOLDER = "/Users/t/Desktop/koreanLikeImages" WAIT_TIME = 5 # 显式等待超时时间 # 创建下载文件夹 if not os.path.exists(DOWNLOAD_FOLDER): os.makedirs(DOWNLOAD_FOLDER) # 初始化Chrome浏览器 options = Options() # options.add_argument('--headless') # 如需无头模式可取消注释 driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) try: # 访问画板页面 driver.get(BOARD_URL) # 登录流程 login_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-test-id='login-button']"))) login_btn.click() email_input = wait.until(EC.visibility_of_element_located((By.ID, "email"))) email_input.send_keys(EMAIL) password_input = wait.until(EC.visibility_of_element_located((By.ID, "password"))) password_input.send_keys(PASSWORD) red_login_btn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "SignupButton"))) red_login_btn.click() # 等待登录完成并回到画板页面 wait.until(EC.url_to_be(BOARD_URL)) time.sleep(2) # 额外等待页面加载完成 # 滚动页面加载可见图片(如需加载全部可添加循环滚动逻辑) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 获取所有图片详情页链接并去重 image_elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div[data-test-id='pin'] a"))) image_links = list(set([elem.get_attribute('href') for elem in image_elements])) # 遍历处理每张图片 for idx, link in enumerate(image_links, 1): print(f"正在处理第 {idx} 张图片: {link}") # 打开图片详情页 driver.get(link) time.sleep(2) try: # 获取高清原图URL img_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "img[data-test-id='pin-closeup-image']"))) img_url = img_element.get_attribute('src') # 替换URL参数获取原图(Pinterest缩略图转原图) if '236x' in img_url: img_url = img_url.replace('236x', 'originals') elif '472x' in img_url: img_url = img_url.replace('472x', 'originals') # 下载并保存图片 img_response = requests.get(img_url, stream=True) if img_response.status_code == 200: filename = f"pin_{idx}_{os.path.basename(img_url.split('?')[0])}" file_path = os.path.join(DOWNLOAD_FOLDER, filename) with open(file_path, 'wb') as f: for chunk in img_response.iter_content(1024): f.write(chunk) print(f"图片已保存至: {file_path}") else: print(f"无法下载图片,状态码: {img_response.status_code}") except Exception as e: print(f"处理图片时出错: {str(e)}") continue # 返回画板页面,准备处理下一张 driver.back() time.sleep(2) finally: # 关闭浏览器 driver.quit()
关键修改说明:
- 显式等待替代固定延时:用
WebDriverWait等待元素加载,避免因网络波动导致的元素定位失败,比time.sleep更可靠。 - 批量获取图片链接:定位画板上所有图片的详情页链接,去重后避免重复处理。
- 直接下载原图:提取高清原图URL用
requests下载,比点击页面下载按钮更稳定,规避下载弹窗的干扰。 - 返回画板逻辑:使用
driver.back()从详情页返回画板,确保流程能循环处理下一张图片。 - 自动创建文件夹:提前检查并创建指定的下载目录,避免保存失败。
可选优化点:
- 若画板图片数量多,可添加循环滚动页面的逻辑,直到加载完所有图片。
- 可增加异常重试机制,对下载失败的图片进行重试。
- 启用
headless模式可在后台运行,不弹出浏览器窗口。
内容的提问来源于stack exchange,提问作者Tdayo
相关产品推荐
相关产品推荐

