【问题标题】:How do I scrape just one specific image using Python Selenium?如何使用 Python Selenium 仅抓取一张特定图像?
【发布时间】:2021-12-21 10:06:07
【问题描述】:

我想从网站上抓取图像并将其存储在指定的文件夹中,但那里的所有教程似乎都只教如何抓取多个图像。 例如,我想从https://duckduckgo.com/?q=Puppy&t=h_&ia=web 中抓取这张可以立即看到的小狗图像并将其保存在我的桌面上。我该怎么办?

目前我才弄明白的代码是:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

PATH = "C:\Coding\Codes\Python\edgedriver\msedgedriver.exe"
driver = webdriver.Edge(PATH)
driver.maximize_window()
driver.get("https://duckduckgo.com/")

searchbox = driver.find_element_by_id("search_form_input_homepage")
searchbox.send_keys("Puppy")
searchbox.send_keys(Keys.ENTER)

#then save the puppy's image to a specified folder, say inside C:\Users\John\Desktop

【问题讨论】:

    标签: python selenium web-scraping xpath css-selectors


    【解决方案1】:

    要抓取唯一图像的 src 属性的值,可以使用以下任一Locator Strategies

    • 使用css_selector

      print(driver.find_element(By.CSS_SELECTOR, "a.module__image>img").get_attribute("src"))
      
    • 使用xpath

      print(driver.find_element(By.XPATH, "//a[@class='module__image']/img").get_attribute("src"))
      

    理想情况下,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.module__image>img"))).get_attribute("src"))
      
    • 使用XPATH

      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[@class='module__image']/img"))).get_attribute("src"))
      
    • 控制台输出:

      https://duckduckgo.com/i/a49fa21e.jpg
      
    • 注意:您必须添加以下导入:

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

    【讨论】:

    • 好的,打印出图片的链接。但是如果我想将图像本身保存到指定的文件夹中呢?
    • 由于没有使用 Selenium 难以实现的 Download 链接/按钮,您可能需要查看其他一些选项,最好使用 Requests 模块。
    【解决方案2】:

    你可以使用 urllib.request 库

    import urllib.request
    from random import *
    import random,string
    
    sampleImage = driver.find_element_by_xpath('your xpath').get_attribute('src')
    characters = 5
    letters = string.ascii_lowercase
    img_str = ''.join(random.choice(letters) for i in range(characters))
    fullname = str(img_str) + '.jpg'
    filepath = 'E:\\crawling\\IMG\\' + fullname
    urllib.request.urlretrieve(sampleImage,filepath)
    print(fullname)
    
    

    我希望这会成功。我使用随机库来命名带有随机字符的图像。

    如果你想循环图像,这里是代码

    import urllib.request
    from random import *
    import random,string
    
    j=1
    imagename=[]
    for images in driver.find_elements_by_xpath('//*[@id="w0"]/div[1]/div/div/div/div/div/div/div[1]/table/tbody/tr'):
            sampleImage[j] = driver.find_element_by_xpath('//*[@id="w0"]/div[1]/div/div/div/div/div/div/div[1]/table/tbody/tr[%d]/td[1]/img' % (j,)).get_attribute('src')
            print(sampleImage[j])
            characters = 10
            letters = string.ascii_lowercase
            img_str = ''.join(random.choice(letters) for i in range(characters))
            fullname[j] = str(img_str) + '.jpg'
            filepath[j] = 'E:\\crawling\\IMG-FARAH\\' + fullname[j]
            urllib.request.urlretrieve(sampleImage[j],filepath[j])
            imagename.append(fullname[j])
            print(fullname[j])
            j=j+1   
    

    我还添加了示例 xpath 和变量,它们会在每次计数后更新

    【讨论】:

    • 如何查找 xpath?
    • 我已经更新了答案。请立即查看
    • 只需进入控制台>元素选项卡并将鼠标悬停在图像上,然后通过右键单击控制台中的标签,您可以找到复制>复制XPath ..您可以从那里获取它
    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 2019-08-14
    • 2016-07-17
    • 1970-01-01
    • 2013-09-25
    • 2015-03-22
    • 2022-10-05
    • 2023-04-02
    相关资源
    最近更新 更多