Eu estava procurando uma maneira de percorrer uma página da web dinâmica e parar automaticamente assim que o final da página fosse alcançado e encontrei este tópico.
O post de @Cuong Tran , com uma modificação principal, foi a resposta que eu estava procurando. Eu pensei que outros pudessem achar a modificação útil (ela tem um efeito pronunciado sobre como o código funciona), por isso neste post.
A modificação é mover a instrução que captura a última altura da página dentro do loop (para que cada verificação seja comparada à altura da página anterior).
Então, o código abaixo:
Rola continuamente uma página da Web dinâmica ( .scrollTo()
), parando apenas quando, por uma iteração, a altura da página permanece a mesma.
(Há outra modificação, em que a instrução break está dentro de outra condição (caso a página 'fique') que pode ser removida).
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