#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