如何修改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
相关产品推荐
相关产品推荐

