Blender下Selenium爬取谷歌图片代码Chrome闪退无报错问题
问题现象
- 运行环境:在Blender 3D内运行Python爬虫代码,目标为从谷歌图片搜索结果爬取并下载5张图片,后续计划基于该逻辑开发Blender功能插件
- 预期流程:启动Chrome浏览器后,依次模拟点击图片、触发下载、滚动页面定位下一张图片重复操作,累计完成5张图片下载
- 实际表现:Chrome启动后仅闪现1秒就自动关闭,全程无Python错误抛出
- 控制台仅输出1条弃用警告与DevTools监听信息:
E:\GLOBAL ASSETS\SCRIPTING\Web Scraping Images\web-scraper.blend\web-scraper.py:21: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
DevTools listening on ws://127.0.0.1:52643/devtools/browser/ea448f70-0066-4d50-bfb8-8671528789b8
核心故障原因
所有问题均由代码语法、缩进、逻辑错误导致,和Blender运行环境无关:
- 致命缩进错误(Chrome闪退直接原因):Python对缩进高度敏感,原代码中除了
scroll_down内部函数定义外,打开目标网页、初始化爬取列表、循环找图、返回结果的所有逻辑,都被错误缩进至scroll_down函数内部。调用get_images_from_google时,函数仅完成内部函数定义就直接返回空值,代码立刻走到最后一行wd.quit()关闭浏览器,因此出现Chrome闪退的现象。 - 语法错误被异常吞噬:点击图片后的等待代码错写为
time.sleep.delay,正确写法为time.sleep(delay),这行本会触发属性错误,但外层使用了无差别的裸except:直接吞掉所有异常,控制台看不到任何报错提示。 - Selenium初始化写法过时:直接给
webdriver.Chrome()传驱动路径的写法已在新版Selenium中弃用,触发看到的弃用警告,虽然不直接导致闪退,但不符合新版API规范。 - 逻辑缺失:原代码爬取到图片URL后完全没有调用
download_image函数,即使爬取逻辑正常运行也不会实际下载图片到本地。 - 递归死循环风险:原缩进下
scroll_down函数内部会调用自身,一旦触发就会无限递归直到栈崩溃。
修复方案
- 修正所有代码缩进,将页面访问、爬取循环逻辑移到
get_images_from_google函数直属层级,scroll_down仅保留滚动页面+等待的逻辑 - 替换Selenium初始化写法,导入
Service类传入驱动路径,解决弃用警告 - 修正
time.sleep的语法错误 - 替换裸
except为带异常打印的捕获逻辑,方便后续排查问题 - 补全下载逻辑,爬取到URL后循环调用下载函数保存图片
- 增加异常等待时间,避免页面未加载完成就查找元素导致失败
修复后的可运行代码如下:
import bpy import os import random from random import randrange from PIL import Image from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import requests import io import time # 配置参数 DRIVER_PATH = "E:\\GLOBAL ASSETS\\SCRIPTING\\Web Scraping Images\\chromedriver.exe" SAVE_PATH = "E:\\GLOBAL ASSETS\\SCRIPTING\\Web Scraping Images\\downloads\\" SEARCH_URL = "https://www.google.com/search?q=cats+2019+IMDb&sxsrf=ALiCzsZmBIp-JZmZv23v6ORoc0VL2NRuxg:1654543304286&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiRjquPxpn4AhUymo4IHbC6Cx0Q_AUoAnoECAEQBA&biw=1536&bih=714&dpr=1.25#imgrc=ixH-uoDQFN_gpM" MAX_IMAGES = 5 LOAD_DELAY = 2 # 初始化Selenium(修正弃用警告) service = Service(executable_path=DRIVER_PATH) wd = webdriver.Chrome(service=service) def scroll_down(wd): wd.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(LOAD_DELAY) def get_images_from_google(wd, max_images): # 打开目标搜索页 wd.get(SEARCH_URL) image_urls = set() while len(image_urls) < max_images: scroll_down(wd) # 查找缩略图 thumbnails = wd.find_elements(By.CLASS_NAME, "Q4LuWd") # 从已爬取数量之后的缩略图开始处理 for img in thumbnails[len(image_urls):max_images]: try: img.click() time.sleep(LOAD_DELAY) except Exception as e: print(f"点击缩略图失败: {e}") continue # 查找大图元素 images = wd.find_elements(By.CLASS_NAME, "n3VNCb") for image in images: src = image.get_attribute('src') if src and 'http' in src: image_urls.add(src) print(f"已找到图片链接 {len(image_urls)}/{max_images}") break return image_urls def download_image(download_path, url, file_name): try: image_content = requests.get(url, timeout=10).content image_file = io.BytesIO(image_content) image = Image.open(image_file) file_path = os.path.join(download_path, file_name) with open(file_path, "wb") as f: image.save(f, "PNG") print(f"图片保存成功: {file_path}") except Exception as e: print(f"图片下载失败 - {e}") if __name__ == "__main__": # 创建保存目录 os.makedirs(SAVE_PATH, exist_ok=True) urls = get_images_from_google(wd, MAX_IMAGES) # 循环下载图片 for idx, url in enumerate(urls): download_image(SAVE_PATH, url, f"cat_{idx+1}.png") wd.quit()
额外注意事项
- 提前创建好图片保存目录,或用代码自动创建,否则会因路径不存在导致保存失败
- 谷歌图片的类名
Q4LuWd、n3VNCb是前端动态生成的,后续如果谷歌页面改版需要重新抓取对应选择器替换,否则会找不到元素 - 保证Blender内置Python安装的Selenium版本、本地Chrome浏览器版本、chromedriver驱动版本三者完全匹配,否则会出现启动异常
- 不要使用裸
except:捕获所有异常,会直接吞掉错误信息大幅提升排查难度
内容的提问来源于stack exchange,提问作者Joe Morris
相关产品推荐
相关产品推荐

