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

如何批量下载全部图片?为何我的代码仅下载16张图片?

图片下载问题解答

为什么你的代码只下载16张图片?

  • 仅点击了一次「加载更多」按钮:网站需要多次点击该按钮才能加载完所有图片,你当前只触发了一次加载,自然只能获取到初始+第一批加载的16张图
  • 绝对XPATH兼容性差:你用的/html/body/div[6]/div[2]/div/div/div/div/div/div[1]/a/div/img是绝对路径,页面结构稍有变动就会失效,且只能匹配当前已加载的部分图片
  • 未等待新内容渲染:点击加载更多后立刻获取元素,新加载的图片还没完成渲染,无法被抓取到
  • 滚动逻辑不完善:固定滚动7次每次200像素,可能没滚到触发懒加载的位置,导致部分图片未加载

如何修改代码下载全部图片?

调整后的代码如下,优化了加载逻辑和元素定位:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import urllib.request

url = "https://focastock.com/?s=food"
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(10)  # 合理设置隐式等待时长

imagem = []
counter = 1
download_path = "C:\\__Imagens e Planilhas Python\\Facebook\\Imagens\\ImagensJPG\\"

# 循环点击加载更多,直到按钮消失
while True:
    try:
        # 滚动到加载更多按钮位置,确保可点击
        load_more_btn = driver.find_element(By.CLASS_NAME, "facetwp-load-more")
        driver.execute_script("arguments[0].scrollIntoView();", load_more_btn)
        time.sleep(1)
        load_more_btn.click()
        time.sleep(2)  # 等待新内容加载完成
        # 滚动到页面底部,触发懒加载图片加载
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(1)
    except:
        # 找不到按钮说明已加载完所有内容,退出循环
        break

# 用相对XPATH定位所有图片,更稳定
images = driver.find_elements(By.XPATH, "//div[contains(@class, 'post-item')]//a/div/img")
for img in images:
    atributoSrc = img.get_attribute("src")
    if atributoSrc:  # 跳过空src的无效图片
        file_name = f"image{counter:02d}.jpg"
        imagem.append(atributoSrc)
        urllib.request.urlretrieve(atributoSrc, f"{download_path}{file_name}")
        counter += 1

driver.quit()

额外注意事项

  • 根据你使用的浏览器,替换webdriver.Chrome()为对应驱动(如Firefox对应webdriver.Firefox())
  • 可根据网站实际加载速度,调整time.sleep()的时长,避免因加载不充分导致漏抓
  • 部分网站存在反爬机制,若频繁请求被限制,可适当延长等待时间,或给urllib添加自定义请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:20:38