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

如何修改Python代码实现Google Lens结果图片自动下载?

如何修改代码以下载Google Lens相似图片结果

问题说明

我需要通过代码自动下载Google Lens返回的相似图片,但目前代码仅能处理Google图片搜索的结果,无法适配Lens页面,希望明确需要修改的代码部分。

现有代码

import bs4
import requests
from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By

# 创建保存图片的目录
folder_name = 'images/soup'
if not os.path.isdir(folder_name):
    os.makedirs(folder_name)


def download_image(url, folder_name, num):
    # 写入图片到文件
    response = requests.get(url)
    if response.status_code == 200:
        with open(os.path.join(folder_name, str(num) + ".jpg"), 'wb') as file:
            file.write(response.content)


from selenium.webdriver.chrome.service import Service
chromePath='C:/Users/A/Downloads/chromedriver_win322/chromedriver.exe'
driver=webdriver.Chrome(chromePath)

# s = Service('C:/Users/ASUS/Downloads/chromedriver_win322/chromedriver.exe')
# driver = webdriver.Chrome(service=s)

search_URL = "https://www.google.com/search?q=sulu+k%C3%B6fte&tbm=isch&ved=2ahUKEwiNiqr85YD9AhXcwwIHHT59D74Q2-cCegQIABAA&oq=sulu+k&gs_lcp=CgNpbWcQARgAMggIABCABBCxAzIICAAQgAQQsQMyBQgAEIAEMgsIABCABBCxAxCDATIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEMgUIABCABDoECAAQQzoICAAQsQMQgwE6BwgAELEDEEM6BQgAELEDUI8IWL4bYL8kaAFwAHgAgAG_AYgBpAiSAQMwLjiYAQCgAQGqAQtnd3Mtd2l6LWltZ8ABAQ&sclient=img&ei=FeXgY82rG9yHi-gPvvq98As&bih=722&biw=1519&hl=tr"
driver.get(search_URL)

a = input("Waiting...")

# 滚动到顶部
driver.execute_script("window.scrollTo(0, 0);")
page_html = driver.page_source
pageSoup = bs4.BeautifulSoup(page_html, 'html.parser')
containers = pageSoup.findAll('div', {'class': "isv-r PNCib MSM1fd BUooTd"})
print(len(containers))
len_containers = len(containers)

for i in range(1, len_containers + 1):
    if i % 25 == 0:
        continue

    xPath = """//*[@id="islrg"]/div[1]/div[%s]""" % (i)

    previewImageXPath = """//*[@id="islrg"]/div[1]/div[%s]/a[1]/div[1]/img""" % (i)
    previewImageElement = driver.find_element_by_xpath(previewImageXPath)
    previewImageURL = previewImageElement.get_attribute("src")

    driver.find_element_by_xpath(xPath).click()

    # 等待大图加载
    timeStarted = time.time()
    while True:
        imageElement = driver.find_element_by_xpath(
            """//*[@id="Sva75c"]/div[2]/div/div[2]/div[2]/div[2]/c-wiz/div[2]/div[1]/div[1]/div[2]/div/a/img"""
        )
        imageURL = imageElement.get_attribute('src')

        if imageURL != previewImageURL:
            break
        else:
            currentTime = time.time()
            if currentTime - timeStarted > 10:
                print("超时!将下载低分辨率图片并继续")
                break

    # 下载图片
    try:
        download_image(imageURL, folder_name, i)
        print("已下载第 %s 张,共 %s 张。URL: %s" % (i, len_containers + 1, imageURL))
    except:
        print("无法下载第 %s 张图片,继续下载下一张" % (i))

核心修改要点

1. 替换目标URL

将原代码中的search_URL直接替换为你的Google Lens搜索链接,Lens的URL结构和图片搜索完全不同,不需要tbm=isch这类图片搜索专属参数。

2. 重写元素定位逻辑

Google Lens页面的DOM结构和图片搜索差异极大,所有元素选择器都需要重新获取:

  • 图片容器:原代码中containers = pageSoup.findAll('div', {'class': "isv-r PNCib MSM1fd BUooTd"})是针对图片搜索的容器选择器,Lens中相似图片的容器类名可能是Vd9M6或其他,需通过浏览器F12开发者工具查看实际类名或XPath。
  • 预览图片路径:原previewImageXPath对应图片搜索的预览图结构,Lens中预览图的XPath需要重新定位,比如可能是//div[@class='Vd9M6']/img(需根据实际页面调整)。
  • 大图元素路径:点击图片后的大图元素XPath和原代码中Sva75c相关路径完全无关,需要重新查看Lens大图弹窗中的img标签位置,替换循环内的imageElement定位代码。

3. 优化滚动加载逻辑

Lens页面的滚动加载触发方式和图片搜索不同,原代码的滚动逻辑可能无法加载更多结果。建议添加循环滚动到底部并等待加载的逻辑:

# 滚动加载更多结果
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

4. 替换为显式等待机制

原代码用循环+超时的方式等待大图加载,稳定性较差,建议改用Selenium的WebDriverWait显式等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

# 点击预览图后等待大图加载
try:
    imageElement = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "你的Lens大图XPath"))
    )
    imageURL = imageElement.get_attribute('src')
except TimeoutException:
    print("大图加载超时,使用预览图链接")
    imageURL = previewImageURL

内容的提问来源于stack exchange,提问作者SILA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:10:29