Я искал способ прокрутки динамической веб-страницы и автоматической остановки при достижении конца страницы, и нашел этот поток.
Сообщение @Cuong Tran с одной важной модификацией было тем ответом, который я искал. Я подумал, что другие могут найти эту модификацию полезной (она явно влияет на работу кода), отсюда и этот пост.
Модификация заключается в перемещении оператора, который фиксирует высоту последней страницы внутри цикла (так, чтобы каждая проверка сравнивалась с высотой предыдущей страницы).
Итак, код ниже:
Непрерывно прокручивает динамическую веб-страницу ( .scrollTo()
), останавливаясь только тогда, когда для одной итерации высота страницы остается прежней.
(Есть еще одна модификация, где оператор break находится внутри другого условия (в случае, если страница «заедает»), которое можно удалить).
SCROLL_PAUSE_TIME = 0.5
while True:
# Get scroll height
### This is the difference. Moving this *inside* the loop
### means that it checks if scrollTo is still scrolling
last_height = driver.execute_script("return document.body.scrollHeight")
# Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
# try again (can be removed)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
# check if the page height has remained the same
if new_height == last_height:
# if so, you are done
break
# if not, move on to the next loop
else:
last_height = new_height
continue