Загрузите все файлы с помощью selenium python

#python #selenium #web-scraping

Вопрос:

Я пытаюсь загрузить все изображения и аннотации по этой ссылке: https://data.mendeley.com/datasets/pwyyg8zmk5/2

Например, я хочу загрузить все изображения в папку «Велосипед». Затем для каждого файла изображения есть кнопка загрузки. Я пытался сделать это с помощью selenium таким образом (Xpath=»//a[@aria-label=» Загрузить файл»]»), но он загружает только первое изображение, как я могу загрузить их все? Возможно ли это с селеном?

 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 Driverchromedriver.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()
 

Ответ №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_element s_by_xpath вместо find_element_by_xpath, он возвращает список всех html-элементов, которые соответствуют //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-элемент вниз).

Комментарии:

1. Он загружает первые 22 изображения, а затем выдает следующую ошибку: Исключение StaleElementReferenceException: устаревший элемент ссылка: элемент не прикреплен к документу страницы (Информация о сеансе: chrome=92.0.4515.131)

2. можете ли вы попробовать запустить его снова?

3. Это может произойти, если вы будете манипулировать страницей во время выполнения сценария.

4. Хотя, если вы просто хотите загрузить изображения с этой страницы, я должен порекомендовать вам найти соответствующие запросы для этого, например: data.mendeley.com/public-api/datasets/pwyyg8zmk5/files/…

5. Да, теперь он загрузил все, проблема заключалась в том, что я прокручивал окно, и я думаю, что сначала показывались только первые 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