Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2024, 00:14   #1
shany
Новичок
Джуниор
 
Регистрация: 30.05.2024
Сообщений: 1
По умолчанию Парсинг динамического блока + скролинг

Здравствуйте создал тестовый аккаунт маил. подскажите как вытянуть динамические значения блока загрузки файлов и сделать нормальный скроллинг. Вот что получается у меня но почему то новых значений при скролле не добавляется
Код:
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()
Сам скрипт кликает поочередно по всем иконкам "скачать" и отлавливает запросы где находятся урл прямой загрузки.
shany вне форума Ответить с цитированием
Старый 10.07.2024, 00:24   #2
MakarovDs
Пользователь
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 43
По умолчанию

Цитата:
Сообщение от shany Посмотреть сообщение
Здравствуйте создал тестовый аккаунт маил. подскажите как вытянуть динамические значения блока загрузки файлов и сделать нормальный скроллинг. Вот что получается у меня но почему то новых значений при скролле не добавляется
Код:
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()
Сам скрипт кликает поочередно по всем иконкам "скачать" и отлавливает запросы где находятся урл прямой загрузки.
В вашем коде вы не сохраняете динамически создаваемые данные (URL-адреса скачивания) в переменные. Для этого нужно использовать следующую логику:

Код:
# Сначала находим все иконки "Скачать".
download_icons = driver.find_elements(By.CSS_SELECTOR, 'div[id="download-icon"]')

# Затем для каждой иконки:
for icon in download_icons:
    # Выполняем наведение на элемент и щелкаем по нему.
    ActionChains(driver).move_to_element(icon).click(icon).perform()

    # Ждем, пока запрос будет отправлен.
    time.sleep(2)

    # Перехватываем запросы и извлекаем URL-адреса загрузки.
    intercept_requests(driver)
Нормальный скроллинг

Чтобы обеспечить нормальный скроллинг, необходимо:
  1. Прокручивать страницу с интервалами, чтобы дать время браузеру загрузить новые данные.
  2. Проверять, достигли ли вы конца страницы, сравнивая текущую высоту прокрутки с высотой документа.

Вот обновленный код скроллинга:

Код:
# Прокручиваем страницу до конца вниз с интервалами.
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
MakarovDs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Blowfish (резервирование дополнительного байта для блока, говорящий о длине блока) ITdocer Общие вопросы C/C++ 0 21.05.2014 15:40
Скролинг в паскале InoyKe Паскаль, Turbo Pascal, PascalABC.NET 8 14.09.2012 20:34
скролинг TDBGrid azat БД в Delphi 5 18.01.2008 15:12
скролинг по DBGrid azat БД в Delphi 5 07.12.2007 14:11