Как проскроллить страницу несколько раз? (selenium)

Рейтинг: 0Ответов: 1Опубликовано: 09.03.2023
try:
    catalog = driver.find_element(By.XPATH, "//*[@id='info_katalog']").click()
    time.sleep(5)
    category = driver.find_element(By.LINK_TEXT, "Косметика").click()
    time.sleep(5)
    footer_site = driver.find_element(By.CLASS_NAME, "block-footer1") #БЕСИТ 
    action.move_to_element(footer_site).perform()
    time.sleep(5)
    footer_site = driver.find_element(By.CLASS_NAME, "block-footer1") #БЕСИТ 
    action.move_to_element(footer_site).perform()
    time.sleep(5)
    footer_site = driver.find_element(By.CLASS_NAME, "block-footer1") #БЕСИТ 
    action.move_to_element(footer_site).perform()
    time.sleep(5)
    footer_site = driver.find_element(By.CLASS_NAME, "block-footer1") #БЕСИТ 
    action.move_to_element(footer_site).perform()
    time.sleep(5)
    if driver.find_elements(By.CLASS_NAME, "tovar"):
        with open("C:/Users/SERGEY/PycharmProjects/ТEST/Test1", "w",
                  encoding="utf=8") as file:
            file.write(driver.page_source)
            time.sleep(5)

Только учусь делать парсеры и осваиваю селениум. Сейчас пытаюсь спарсить товары с динамического сайта, где много страниц с товарами (которые показываются по мере скролла). Вопрос - можно ли этот метод использовать несколько раз без такой портянки? И как построить цикл из скроллинга вниз, если при ручной загрузке не появляется ни всплывающих полей, текста по подобию "Товаров больше нет"? (поэтому не понимаю как можно использовать while True, чтобы поставить условие). P.s: Скроллить по количеству пикселей совсем не хочется((

Ответы

▲ 0

Если нужно прокрутить к целевому элементу, можно воспользоваться методом .move_to_element() из ActionChains, пример:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get('http://www.example.com/')
target = driver.find_element_by_link_text('BROWSE TEMPLATES')
actions = ActionChains(driver)
actions.move_to_element(target)
actions.perform()

Второй вариант цикл скроллинга

from selenium.webdriver.common.keys import Keys

while True:
    # прокручиваем страницу до конца
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)
    # проверяем, появились ли новые товары
    if driver.find_elements(By.CLASS_NAME, "tovar"):
        with open("C:/Users/SERGEY/PycharmProjects/ТEST/Test1", "w", encoding="utf=8") as file:
            file.write(driver.page_source)
    else:
        break

Для прокрутки в конец (начало) страницы через .send_keys():

from selenium import webdriver
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Chrome()
driver.get('http://www.example.com/')
driver.find_element_by_tag_name('body').send_keys(Keys.END)
# send_keys(Keys.HOME), если в начало
# так тоже сработает:
# send_keys(Keys.DOWN) send_keys(Keys.PAGE_DOWN)
# send_keys(Keys.UP) send_keys(Keys.PAGE_UP)

Для прокрутки на заданное количество пикселей метод окна .scrollBy():

scroll_vаlue = -200
scroll_by = f'window.scrollBy(0, {scroll_vаlue});'
driver.execute_script(scroll_by)