Прокрутка страниц .execute_script()



Полоса прокрутки представляет собой тонкую, длинную часть на краю дисплея компьютера. Используя полосу прокрутки, мы можем просматривать весь контент или всю страницу, прокручивая её вверх и вниз или влево и вправо с помощью мыши.

Самый простой способ прокрутки страницы по пикселям — это использование метода .execute_script(), который выполняет код JavaScript на странице. К примеру, window.scrollBy(0, 5000) прокрутит страницу вниз на 5000 пикселей.

Можете проверить на этом сайте

window.scrollBy(X, Y);

X — смещение в пикселях по горизонтали;
Y — смещение в пикселях по вертикали.

import time
from selenium import webdriver

with webdriver.Chrome() as browser:
    browser.get('https://mob25.com/')
    browser.execute_script("window.scrollBy(0,5000)")
    time.sleep(10)

Такой способ имеет свои преимущества, простота использования — одно из них. Недостаток такого способа заключается в том, что если сайт отдаёт данные при каждом скроллинге, вам придётся ждать, пока сервер загрузит данные. К примеру, комментарии загружаются по 17 штук, и если на странице 170 комментариев, то вам придётся сделать 10 скроллов, чтобы получить их все. Каждая загрузка 17 комментариев занимает примерно 2–3 секунды, соответственно, вам необходимо устанавливать тайминги. Самый простой способ сделать это — time.sleep(3).

Напишем простой код, который прокрутит страницу вниз за 10 итераций.

import time
from selenium import webdriver

with webdriver.Chrome() as browser:
    browser.get('https://mob25.com/')
    for i in range(10):
        browser.execute_script("window.scrollBy(0,5000)")
        time.sleep(2)

Мы сделали 10 итераций и не оказались в самом низу страницы, потому что не знаем, какова высота нашего сайта в пикселях. Мы можем использовать большие значения, например, window.scrollBy(0, 500000), чтобы одним скроллингом прокрутить всю страницу. Это подходит, когда у вас обычный сайт без динамической подгрузки данных.

Представим, что у вас есть сайт, который имеет разные высоты страниц. Мы можем получить значение высоты непосредственно той части сайта, которая попадает в область вашей видимости, или значение высоты всего сайта.

Команда return document.body.scrollHeight вернёт значение высоты основного элемента на странице — body.

import time
from selenium import webdriver

with webdriver.Chrome() as browser:
    browser.get('https://mob25.com/')
    height = browser.execute_script("return document.body.scrollHeight")
    time.sleep(2)
    print(height)
>>>81000

Наш сайт имеет высоту 81 000 пикселей. Для вычисления высоты видимой области сайта используется скрипт.

Код window.innerHeight используется для получения высоты, а window.innerWidth — для получения ширины видимой области.

from selenium import webdriver

with webdriver.Chrome() as browser:
    browser.get('https://mob25.com/')
    height = browser.execute_script("return window.innerHeight")
    print(height)
>>> 887

На нашем сайте видимая область составляет 887 пикселей. Определённые методы, такие как .click() или .send_keys()и др., могут быть выполнены только в случае, если нужный элемент расположен в этой видимой зоне экрана.

Если вам необходимо прокрутить страницу до самого низа, до последнего пикселя, одним из самых простых способов будет использование скрипта window.scrollTo(0, document.body.scrollHeight).

import time
from selenium import webdriver

with webdriver.Chrome() as browser:
    browser.get('https://mob25.com/')
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

Где значение 0 означает горизонтальное смещение в пикселях от начальной точки прокрутки. В данном случае, 0 говорит о том, что прокрутка будет совершена без горизонтального смещения, то есть по вертикали.

При написании парсеров часто необходимо сначала совершить необходимое количество скроллинга, чтобы загрузилась вся нужная вам информация. После того, как вся необходимая информация появилась на странице, мы собираем всё при помощи метода .find_elements(). Однако об этом мы будем говорить позже.

.execute_script()

Синтаксис: webdriver.execute_script(script, *args).

В методе .execute_script() можно использовать различные полезные параметры. Полный список всех событий можно просмотреть тут и тут, но ниже приведены те, которые чаще всего используются при написании парсеров:

.execute_script(«return arguments[0].scrollIntoView(true);», element) — прокручивает родительский контейнер элемента таким образом, чтобы element, для которого вызывается scrollIntoView, был виден пользователю.

.execute_script(«window.open(‘https://mob25.com/’, ‘tab2’);») — создаст новую вкладку в браузере с именем «tab2».

.execute_script(«return document.body.scrollHeight») — вернёт значение высоты элемента <body>.

.execute_script(«return window.innerHeight») — вернёт значение высоты окна браузера.

.execute_script(«return window.innerWidth») — вернёт значение ширины окна браузера.

.execute_script(«window.scrollBy(X, Y)») — прокрутит документ на заданное число пикселей по осям X и Y.

X — смещение в пикселях по горизонтали.
Y — смещение в пикселях по вертикали.

.execute_script(«alert(‘Ура Selenium’)») — вызывает модальное окно Alert.

.execute_script(«return document.title;») — возвращает title открытого документа.

.execute_script(«return document.documentURI;») — возвращает URL документа.

.execute_script(«return document.readyState;») — возвращает состояние загрузки страницы; вернёт «complete», если страница загрузилась.

.execute_script(«return document.anchors;») — возвращает список всех якорей на странице.

[x.tag_name for x in browser.execute_script(«return document.anchors;»)] — этот код позволяет получить список всех тегов с якорями. Очень полезная инструкция, особенно если при скроллинге элемент для «зацепления» не найден.

.execute_script(«return document.cookie;») — возвращает строку, содержащую все cookies документа, разделённые точкой с запятой.

.execute_script(«return document.domain;») — возвращает домен текущего документа.

.execute_script(«return document.forms;») — возвращает список всех форм на странице.

.execute_script(«window.scrollTo(x-coord, y-coord);») — прокручивает документ до указанных координат:

x-coord — позиция по горизонтальной оси, которая будет отображена вверху
y-coord — позиция по вертикальной оси, которая будет отображена вверху слева.

.execute_script(«return document.getElementsByClassName(‘container’);») — возвращает список всех элементов с классом ‘container’.

.execute_script(«return document.getElementsByTagName(‘container’);») — возвращает список всех элементов с тегом ‘container’.

.execute_script(«return document.getElementById(‘some-id’);») —  возвращает элемент с указанным ID ‘some-id’.



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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: