如何批量下载全部图片?为何我的代码仅下载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
相关产品推荐
相关产品推荐

