Python中Selenium WebDriver无法获取全部图片链接的原因与解决办法
问题分析与解决办法
问题根源确实是JavaScript动态渲染——这个网站用了滚动加载,初始页面只渲染可见区域的图片,剩下的得滚动到对应位置才会加载出来,所以你直接爬只能拿到已渲染的160个。
下面是调整后的代码和步骤:
核心修改点
- 循环滚动页面,触发所有图片的加载
- 用显式等待确保元素加载完成,避免遗漏
完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager # 初始化浏览器 chrome_options = webdriver.ChromeOptions() # 按需添加配置,比如无头模式:chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) driver.get('https://www.politicsanddesign.com/') # 滚动加载所有内容 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载(时间可根据网站速度调整) driver.implicitly_wait(3) # 获取新的页面高度 new_height = driver.execute_script("return document.body.scrollHeight") # 高度不再变化说明加载完成 if new_height == last_height: break last_height = new_height # 显式等待所有图片元素加载完成 wait = WebDriverWait(driver, 10) img_elements = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='responsive-image-wrapper']/img"))) # 提取图片URL img_url2 = [] for element in img_elements: try: srcset = element.get_attribute("srcset") if srcset: new_srcset = 'https:' + srcset.split(' 400w', 1)[0] img_url2.append(new_srcset) except Exception as e: print(f"处理图片时出错: {e}") continue # 查看结果数量 print(f"共获取到 {len(img_url2)} 个图片URL") driver.quit()
额外说明
- 滚动等待时间(
implicitly_wait(3))可根据网站加载速度调整,慢的话改成5秒也可以 - 加
try-except是为了避免个别图片的srcset格式异常导致整个循环中断 - 如果还是有遗漏,可以多滚动几次,或者延长等待时间
内容的提问来源于stack exchange,提问作者Damon C. Roberts
相关产品推荐
相关产品推荐

