Как скролить в selenium python
Перейти к содержимому

Как скролить в selenium python

  • автор:

Python. Заключение Selenium (WebScrapping) [4]

В этой статье я, кратко, расскажу о тех возможностях Selenium, о которых не рассказал в предыдущих частях. Таких как:

  • Ввод данных с клавиатуры
  • Переключение на активное окно (пример: окно подтверждения обмена Steam)
  • Выполнение JavaScript.
  • Прокручивание страницы

Ввод данных с клавиатуры

Создайте новый Python скрипт, и перепишите туда следующий код.

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.firefox.firefox_binary import FirefoxBinary def get_webdriver(): option = webdriver.FirefoxOptions() option.set_preference('dom.webdriver.enabled',False) binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') driver = webdriver.Firefox(options=option, firefox_binary=binary) return driver driver = get_webdriver() driver.get('https://www.google.com/') element = driver.find_element(By.CSS_SELECTOR,'input') element.send_keys('tutorial') element.submit()

Нас интересуют 2 последние строчки кода, т.к. остальное разбиралось в предыдущих статьях.

element.send_keys('tutorial')

Здесь, при помощи функции send_keys, вводится текст «tutorial» в элемент с тегом «input» (поле ввода).

element.submit()

После чего, нажимаем Enter

Таким образом, мы создали бота, который гуглит фразу tutorial.

Переключаемся на активное окно

Для переключения на активное окно, используется функция switch_to_window

driver.switch_to_window(driver.window_handles[-1])

Не знаю, зачем вам это может понадобится, но знание этой возможности, лишней точно не будет.

Выполнение javascript.

Для выполнения скриптов, используется функция execute_script(), которая принимает в качестве аргумента JS код. Вот пример работы скрипта.

from selenium import webdriver def get_webdriver(): option = webdriver.FirefoxOptions() option.set_preference('dom.webdriver.enabled',False) binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe') driver = webdriver.Firefox(options=option, firefox_binary=binary) return driver driver = get_webdriver() driver.get('https://under-prog.ru/') driver.execute_script("alert('script working in selenium')")

В данном примере, мы выполнили простейший скрипт на сайте.

Прокручиваем страницу

Прокрутка страницы осуществляется за счет выполнения JS кода (как и на сайтах).

Для скролла, используется scrollTo.

window.scrollTo(x,y)

который принимает x, y координаты.

Если вам нужно прокрутить в самый низ, тогда используйте это:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

document.body.scrollHeight возвращает, полный размер прокрутки.

Также, можно использовать плавную прокрутку, что-бы не вызывать подозрений у сайта.

driver.execute_script("window.scrollTo(< top: document.body.scrollHeight, left: 0, behavior: 'smooth'>);")

Заключение.

Вот мы и закончили с Selenium, в следующей статье мы перейдем к лучшему, на мой взгляд, методу веб-скраппинга . Я говорю о связке reuqests+bs4, которая в отличии от Selenium:

  • Значительно быстрее работает.
  • Не требует веб драйвера (geckodriver.exe)
  • Не требует предустановленного браузера (Firefox)
  • Намного меньше потребляет оперативной памяти.
  • Данный способ работает не на всех сайтах (включен cloudflare или сложный JS).
  • Написание скрипта занимает чуть больше времени.

Как прокрутить страницу вниз на python?

Всем добрый день. Есть парсер, который парсит эту страницу:
https://www.flashscore.ru/
Он кликает на матчи и выводит их ссылку (сайт устроен так, что открывает второй гугл хром и в нем уже этот матч, запустите скрипт и поймёте о чем я говорю). Но после 17 матча (ЛАСК/ШТУРМ) выводит ошибку. Нужно прокручивать страницу вниз, чтобы дальше кликать на матчи. Подскажите, как прокрутить страницу на несколько матчей вниз или вообще до самого низу? Здесь с помощью js это делать? Заранее спасибо.
Код:

import time from selenium import webdriver from selenium.common.exceptions import TimeoutException from bs4 import BeautifulSoup count = 0 driver = webdriver.Chrome(executable_path="C:\\Users\\iljal\\PycharmProjects\\google_sheets\\chromedriver") # здесь указать путь к chromedriver он обычно в той же папке где и Ваш проект driver.get('https://www.flashscore.ru/') time.sleep(3) # C:\Users\iljal\PycharmProjects\google_sheets\chromedriver arr = driver.find_elements_by_css_selector( ".event__match.event__match--scheduled.event__match--oneLine" ) # optional (if you are not satisfied with the download speed) driver.set_page_load_timeout(0.5) for channel in arr: try: channel.click() count += 1 if count == 17: driver.execute_script( "var evt = document.createEvent('MouseEvents');evt.initEvent('wheel', true, true);evt.deltaY = -100000;document.querySelector('.yamb-conversation__content').dispatchEvent(evt);") # такая прокрутка не работает, выводит ошибку: except TimeoutException: print("data not received. need more time in driver.set_page_load_timeout") continue driver.switch_to.window(driver.window_handles[arr.index(channel)+1]) link = driver.current_url print(link) driver.switch_to.window(driver.window_handles[0])

После 17 матчей выводит ошибку при попытке прокрутить вниз:

raise exception_class(message, screen, stacktrace) selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot read property 'dispatchEvent' of null (Session info: chrome=83.0.4103.97)
  • Вопрос задан более трёх лет назад
  • 5095 просмотров

2 комментария

Простой 2 комментария

Python3.x + Selenium как листать [закрыт]

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 2 года назад .

Мне нужно пролистать страницу и нажать на элемент.
Не могу понять, как листать страницу с помощью selenium.
Подскажите, пожалуйста!

Отслеживать
12.5k 7 7 золотых знаков 18 18 серебряных знаков 48 48 бронзовых знаков
задан 5 янв 2021 в 9:28
109 1 1 серебряный знак 9 9 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

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

from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get('http://www.w3schools.com/') target = driver.find_element_by_link_text('BROWSE TEMPLATES') actions = ActionChains(driver) actions.move_to_element(target) actions.perform() 

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

from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('http://www.w3schools.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, );' driver.execute_script(scroll_by) 

Скрол страницы до самого низа

Фотография

Столкнулся с такой задачей — медленный скрол страниц. То есть:

1. Медленно скролить страницу до самого низа

2. Переключение на следующую страницу

В связи с этим два вопроса:

1. Как понять что мы доскролили страницу до самого низа, или до какого-то элемента (что он показался на экране)?

2. Ввиду особенностей сервиса на страницах не работает js (не работает window.scrollBy и window.scrollTo), как можно ещё поскролить страницу?

#2 mttksng

Отправлено 25 мая 2022 — 18:07

2. Как скороллить? — Имитировать нажатие клавиши Page Down (Может не вместиться в категорию медленный скролл)

1. Организовать поиск какого-либо элемента который находится снизу страницы.

Дальше использовать — если элемент найден то -> поиск элемента, клик — > переход на след. страницу.

#3 Snap

Отправлено 27 мая 2022 — 07:07

2. Как скороллить? — Имитировать нажатие клавиши Page Down (Может не вместиться в категорию медленный скролл)

1. Организовать поиск какого-либо элемента который находится снизу страницы.

Дальше использовать — если элемент найден то -> поиск элемента, клик — > переход на след. страницу.

Тоже хотел предложить автору клавиши Page Down и End. Правда у меня они на вскидку не сработали.

Поиск/видимость элемента внизу страницы также хотел предложить.

#4 owhjoiewryojiA1

owhjoiewryojiA1

Отправлено 29 мая 2022 — 06:49

2. Как скороллить? — Имитировать нажатие клавиши Page Down (Может не вместиться в категорию медленный скролл)

1. Организовать поиск какого-либо элемента который находится снизу страницы.

Дальше использовать — если элемент найден то -> поиск элемента, клик — > переход на след. страницу.

А разве поиск элемента определяет виден ли он на экране (доскролились до него) или нет? Страница — по сути большой документ, и все элементы на нем сразу создаются и отрисовываются, Нужно именно поймать момент когда на очередном этапе скрола элемент появляется на экране пользователя

#5 Snap

Отправлено 30 мая 2022 — 07:55

Да, проверки на нахождение и отображение элемента не скроллят страницу. Можно попробовать сделать хитрость. Например, кликать на элемент внизу страницу, клик на который ни к чему не приведет, кроме скролла страницы вниз.

#6 owhjoiewryojiA1

owhjoiewryojiA1

Отправлено 31 мая 2022 — 07:17

Да, проверки на нахождение и отображение элемента не скроллят страницу. Можно попробовать сделать хитрость. Например, кликать на элемент внизу страницу, клик на который ни к чему не приведет, кроме скролла страницы вниз.

Но мне то нужно не сразу скрольнуться до низу, а постепенно скролить, шаг за шагом. И поймать момент когда на «экране компуктера» появится нужный элемент. Вот в чём загвоздка главная, как поймать этот момент что элемент появился на «экране компуктера»?

#7 Snap

Отправлено 31 мая 2022 — 13:10

Да, проверки на нахождение и отображение элемента не скроллят страницу. Можно попробовать сделать хитрость. Например, кликать на элемент внизу страницу, клик на который ни к чему не приведет, кроме скролла страницы вниз.

Но мне то нужно не сразу скрольнуться до низу, а постепенно скролить, шаг за шагом. И поймать момент когда на «экране компуктера» появится нужный элемент. Вот в чём загвоздка главная, как поймать этот момент что элемент появился на «экране компуктера»?

Так вы попробовали мой совет или нет? Я так понимаю, у вас при прокрутке страницы вниз появляются новые элементы. Никаких проблем. Допустим, вы знаете, что у вас изначально выводится 10 элементов и появляется еще 10. Кликаете или даже просто наводите курсор мыши на последний (10-ый) элемент и у вас выводятся новые элементы. Проверяете, что 11-й элемент существует на странице. У меня работает.

#8 owhjoiewryojiA1

owhjoiewryojiA1

Отправлено 01 июня 2022 — 06:02

Да, проверки на нахождение и отображение элемента не скроллят страницу. Можно попробовать сделать хитрость. Например, кликать на элемент внизу страницу, клик на который ни к чему не приведет, кроме скролла страницы вниз.

Но мне то нужно не сразу скрольнуться до низу, а постепенно скролить, шаг за шагом. И поймать момент когда на «экране компуктера» появится нужный элемент. Вот в чём загвоздка главная, как поймать этот момент что элемент появился на «экране компуктера»?

Так вы попробовали мой совет или нет? Я так понимаю, у вас при прокрутке страницы вниз появляются новые элементы. Никаких проблем. Допустим, вы знаете, что у вас изначально выводится 10 элементов и появляется еще 10. Кликаете или даже просто наводите курсор мыши на последний (10-ый) элемент и у вас выводятся новые элементы. Проверяете, что 11-й элемент существует на странице. У меня работает.

» Я так понимаю, у вас при прокрутке страницы вниз появляются новые элементы»
Нет. Все элементы изначально присутствуют на странице.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *