【问题标题】:Selenium get_attribute('src') of an image returns Base64 instead of an url图像的 Selenium get_attribute('src') 返回 Base64 而不是 url
【发布时间】:2021-12-18 20:18:15
【问题描述】:

我正在使用 selenium 从谷歌图片中自动下载几张图片,因为我之前在互联网上找到的所有其他解决方案都太慢或不起作用,但现在我需要提取图片的来源,但是当我尝试使用 element.get_attribute('src') 时,它返回图像的 base64,甚至当我在 chrome devtools 上搜索 xpath 时,标签的 src 属性实际上是一个 url

代码试验:

        for i in range(n):
            element = self.wait.until(
                EC.presence_of_element_located((By.XPATH, '//*[@id="Sva75c"]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div/a/img')))
            src = element.get_attribute('src')
            print(element)
            self.download_file(src,keyword)

编辑:

我实际上尝试了你们中的一些人所说的,而不是下载图像,我将 base 64 转换为图像并保存它,这比使用请求和 URL 保存要快得多,但我猜这更多是一个问题谷歌脚本比我的代码,因为有时我的代码坏了导致 src 实际上返回了一个 URL,最后,我不得不做两个不同的函数,一个如果 src 返回一个 url,另一个如果返回 base64

【问题讨论】:

  • 你不能只使用图片的 base64 并保存它,而不是获取 URL 并下载它吗?
  • 可能 url 位于不同的元素中 - 也许您应该使用更好的 XPATH(没有所有这些 div 但带有类或 ID。或者它使用 JavaScript 替换值,它需要一些时间。或者服务器为不同的浏览器/设备发送不同的代码。
  • 没有最少的工作代码,很难测试这个问题。
  • 请提供网页网址以便我们进一步调查。

标签: python selenium selenium-webdriver xpath css-selectors


【解决方案1】:

要打印 src 属性的值,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "img[alt='Letter A AC - Decortiles'][src]"))).get_attribute("src"))
    
  • 使用XPATH

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//img[@alt='Letter A AC - Decortiles' and @src]"))).get_attribute("src"))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

【讨论】:

  • 我现在其实在用这个,我代码中的self.wait其实就是webdriverWait,我也习惯用java编程,所以习惯在def __init__中声明太多变量()
  • 我现在实际上正在使用它:很高兴知道。 self.wait:小调整,应该没问题。 在 def init() 中声明过多变量的习惯:这不是任何问题。
  • @GustavoMarinho 很高兴能为您提供帮助。 Vote up questions and answers 您发现这对未来读者的利益很有帮助。见Why is voting important
【解决方案2】:

我可以使用以下代码从另一个搜索引擎 DuckDuckGo 检索实际图像 URL:

search_query = 'what you want to find'
num_images = 1
driver_location = '/put/location/of/your/driver/here'

ser = Service(driver_location)
op = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=ser, options=op)

# searching the query
driver.get(f'https://duckduckgo.com/?q={search_query}&kl=us-en&ia=web')

# going to Images Section
ba = driver.find_element(By.XPATH, "//a[@class='zcm__link  js-zci-link  js-zci-link--images']")
ba.click()

# getting the images URLs
for result in driver.find_elements(By.CSS_SELECTOR, '.js-images-link')[0:0+num_images]:
    imageURL = result.get_attribute('data-id')

    print(f'{imageURL}\n')

driver.quit()

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2020-04-28
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多