在Google Colab用Selenium爬Google图片:仅获20张且代码崩溃求助
解决Google Colab用Selenium爬取Google图片的两个问题
问题1:仅能获取20张随机图片
- URL参数限制:你用的URL带了
ved、biw、bih这类会话专属参数,这些参数会限制图片加载数量,换成简洁的基础URL即可:https://www.google.com/search?q={s}&tbm=isch&tbs=sur%3Afc&hl=en - 滚动加载不彻底:Google图片滚动到底部后,常需要点击「显示更多结果」按钮才会加载新内容,单纯滚动无法触发全部加载
- 元素定位不稳定:
Q4LuWd这类class是动态生成的,可能随时失效,换成更稳定的元素定位器,比如//div[@class='isv-r PNCib MSM1fd BUooTd']//img
问题2:代码崩溃(ValueError: unknown url type: 'None')
- 无效URL导致报错:你直接遍历
range(2000),但实际src列表长度远小于2000,且部分图片的src属性是None(未加载完成的占位图),urlretrieve无法处理这类无效值 - 解决方案:过滤掉非http/https开头的地址,只遍历实际有效的元素数量
修正后的代码示例
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By import time import urllib.request import os # 初始化Chrome选项 options = Options() options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") # 解决Colab内存不足问题 options.headless = True driver = webdriver.Chrome("/usr/bin/chromedriver", options=options) # 使用无会话限制的基础URL url = "https://www.google.com/search?q={s}&tbm=isch&tbs=sur%3Afc&hl=en" driver.get(url.format(s='cubism')) scroll_pause_time = 5 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(scroll_pause_time) # 检查并点击「显示更多结果」按钮 try: show_more_btn = driver.find_element(By.XPATH, "//input[@value='Show more results']") show_more_btn.click() time.sleep(scroll_pause_time) except: pass # 无按钮则继续 # 判断是否已滚动到页面底部 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 定位图片元素,使用更稳定的选择器 imgResults = driver.find_elements(By.XPATH, "//div[@class='isv-r PNCib MSM1fd BUooTd']//img") src = [] for img in imgResults: # 优先取真实大图地址(Google图片存在data-src中),无则取src img_src = img.get_attribute('data-src') or img.get_attribute('src') if img_src and img_src.startswith('http'): src.append(img_src) # 创建保存目录(不存在则新建) save_dir = "/content/drive/MyDrive/painting_dataset/cubism" if not os.path.exists(save_dir): os.makedirs(save_dir) # 遍历有效URL,避免无效请求 for i, img_url in enumerate(src): try: urllib.request.urlretrieve(img_url, f"{save_dir}/cubism{i}.jpg") print(f"第{i+1}张图片保存成功") except Exception as e: print(f"第{i+1}张图片保存失败: {e}") driver.quit()
关键改进说明
- 移除URL中的会话参数,解除加载数量限制
- 增加「显示更多结果」按钮的点击逻辑,确保加载更多图片
- 优先读取
data-src属性,获取真实大图地址(而非缩略图) - 过滤无效URL,仅保留http/https开头的有效地址
- 遍历实际有效的URL列表,避免固定次数导致的索引越界
- 增加目录创建和异常捕获,避免因环境问题中断程序
内容的提问来源于stack exchange,提问作者Oğuzhan Öztürk
相关产品推荐
相关产品推荐

