Здравствуйте создал тестовый аккаунт маил. подскажите как вытянуть динамические значения блока загрузки файлов и сделать нормальный скроллинг. Вот что получается у меня но почему то новых значений при скролле не добавляется
Код:
import csv
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# Настройки для Selenium
chrome_options = Options()
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
# Включение логирования производительности
capabilities = DesiredCapabilities.CHROME.copy()
capabilities['goog:loggingPrefs'] = {'performance': 'ALL'}
# Путь к драйверу ChromeDriver
chrome_driver_path = 'C:\\webdrivers\\chromedriver.exe' # Убедитесь, что путь правильный
# Проверка существования файла
import os
if not os.path.exists(chrome_driver_path):
raise FileNotFoundError(f"ChromeDriver not found at {chrome_driver_path}")
# Инициализация драйвера
service = Service(chrome_driver_path)
try:
driver = webdriver.Chrome(service=service, options=chrome_options, desired_capabilities=capabilities)
except TypeError:
# Используем capabilities вместо desired_capabilities для новых версий Selenium
chrome_options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})
driver = webdriver.Chrome(service=service, options=chrome_options)
# URL страницы авторизации в Mail облако
login_url = 'https://account.mail.ru/login?fail=1'
# Вход в систему
driver.get(login_url)
# Явное ожидание появления элемента для ввода логина
wait = WebDriverWait(driver, 30)
email_field = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[name="username"]')))
email_field.click() # Фокусируемся на поле
email_field.clear() # Очищаем поле на случай, если там есть предустановленное значение
email_field.send_keys('mdierickx@bk.ru')
# Явное ожидание появления кнопки "Далее"
next_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-test-id="next-button"]')))
next_button.click()
# Явное ожидание появления элемента для ввода пароля
password_field = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[name="password"]')))
password_field.click() # Фокусируемся на поле
password_field.clear() # Очищаем поле на случай, если там есть предустановленное значение
password_field.send_keys('Qzwxas12!')
# Явное ожидание появления кнопки "Войти"
login_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-test-id="submit-button"]')))
login_button.click()
# Ждем загрузки страницы
time.sleep(5)
# Переход в облако по указанной ссылке
cloud_url = 'https://cloud.mail.ru/albums/ada729f1-181d-495f-86d5-86f2b5e44fa8'
driver.get(cloud_url)
time.sleep(5) # Ждем загрузки страницы
# Нажимаем на элемент с XPath //*[@id="TOP_TOOLBAR_ID"]/div[2]/div[1]
toolbar_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="TOP_TOOLBAR_ID"]/div[2]/div[1]')))
toolbar_button.click()
# Выбираем опцию "Списком"
list_option = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(text(), "Списком")]')))
list_option.click()
# Прокручиваем страницу до конца вниз
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # Ждем загрузки новой части страницы
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# Находим все иконки с атрибутом div[id="download-icon"]
download_icons = driver.find_elements(By.CSS_SELECTOR, 'div[id="download-icon"]')
# Перехватываем запросы и сохраняем URL-ы
download_urls = []
# Включаем перехват сетевых запросов
driver.execute_cdp_cmd('Network.enable', {})
def intercept_requests(driver):
logs = driver.get_log('performance')
for log in logs:
message = json.loads(log['message'])['message']
if message['method'] == 'Network.requestWillBeSent':
url = message['params']['request']['url']
if 'datacloudmail.ru/attach/' in url:
download_urls.append(url)
for icon in download_icons:
ActionChains(driver).move_to_element(icon).click(icon).perform()
time.sleep(2) # Ждем, чтобы запрос был отправлен
intercept_requests(driver)
# Сохраняем результаты в CSV
with open('download_urls.csv', mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['File Name', 'Download URL'])
for url in download_urls:
file_name = url.split('/')[-1]
writer.writerow([file_name, url])
# Закрываем драйвер
driver.quit()
Сам скрипт кликает поочередно по всем иконкам "скачать" и отлавливает запросы где находятся урл прямой загрузки.