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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:33:16