【问题标题】:Download all files with selenium python使用 selenium python 下载所有文件
【发布时间】:2021-08-11 16:28:35
【问题描述】:

我正在尝试从此链接下载所有图像和注释:https://data.mendeley.com/datasets/pwyyg8zmk5/2

例如,我想下载自行车文件夹中的所有图像。然后每个图像文件都有一个下载按钮。我尝试以这种方式使用 selenium 执行此操作(Xpath="//a[@aria-label='Download file']"),但它只下载第一个图像,我怎样才能下载所有图像?硒可以吗?

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


driver= webdriver.Chrome(executable_path="F:\Chrome Driver\chromedriver.exe")

driver.get("https://data.mendeley.com/datasets/pwyyg8zmk5/2")

driver.maximize_window()

driver.implicitly_wait(20)

folder= driver.find_element_by_xpath("//span[@title='Bicycle']")
    
folder.click()

folder= driver.find_element_by_xpath("//span[@title='images']")
folder.click()


driver.implicitly_wait(10)
folder= driver.find_element_by_xpath("//a[@aria-label='Download file']")
folder.click()

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    试试这个:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver= webdriver.Chrome()
    
    driver.get("https://data.mendeley.com/datasets/pwyyg8zmk5/2")
    
    driver.maximize_window()
    
    driver.implicitly_wait(20)
    
    folder= driver.find_element_by_xpath("//span[@title='Bicycle']")
        
    folder.click()
    
    folder= driver.find_element_by_xpath("//span[@title='images']")
    folder.click()
    
    
    driver.implicitly_wait(10)
    d_list = driver.find_elements_by_xpath("//a[@aria-label='Download file']")
    for d in d_list:
        d.click()
        d_list.extend([a for a in driver.find_elements_by_xpath("//a[@aria-label='Download file']") if a not in d_list])
    

    首先,请注意我使用了find_elements_by_xpath而不是find_element_by_xpath,它返回了每个html元素的列表 strong> 与//a[@aria-label='Download file'] 匹配。

    该列表不完整,因为页面一开始只显示前 21 个结果,这就是为什么您必须在循环中添加此代码:

    d_list.extend([a for a in driver.find_elements_by_xpath("//a[@aria-label='Download file']") if a not in d_list])
    

    当您再次点击下载图片时,它会找到新图片(因为它会向下滚动 html 元素)。

    【讨论】:

    • 它会下载前 22 张图片,然后出现此错误:StaleElementReferenceException: stale element reference: element is not attach to the page document (Session info: chrome=92.0.4515.131)
    • 你能再试一次吗?
    • 如果您在脚本运行时操作页面,就会发生这种情况。
    • 不过,如果您只是想从该页面下载图像,我建议您找到相关请求来执行此操作,例如:data.mendeley.com/public-api/datasets/pwyyg8zmk5/files/…
    • 是的,它现在下载了所有内容,问题是我正在滚动窗口,我认为在自动滚动之前只显示了前 21 张图片
    【解决方案2】:

    你可以用这个:

    x=0
    while True:
      x+=1
      try:
        folder= driver.find_element_by_xpath("//*[@id="main"]/div[2]/article/section[2]/div[3]/div/div[1]/div/div/div["+str(x)+"]/a/svg")
        folder.click()
      except:
        pass
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      相关资源
      最近更新 更多