현재 셀레늄 웹 드라이버를 사용하여 페이스 북 사용자 친구 페이지를 구문 분석하고 AJAX 스크립트에서 모든 ID를 추출합니다. 그러나 모든 친구를 얻으려면 아래로 스크롤해야합니다. 셀레늄에서 아래로 스크롤하는 방법 나는 파이썬을 사용하고 있습니다.
현재 셀레늄 웹 드라이버를 사용하여 페이스 북 사용자 친구 페이지를 구문 분석하고 AJAX 스크립트에서 모든 ID를 추출합니다. 그러나 모든 친구를 얻으려면 아래로 스크롤해야합니다. 셀레늄에서 아래로 스크롤하는 방법 나는 파이썬을 사용하고 있습니다.
답변:
당신이 사용할 수있는
driver.execute_script("window.scrollTo(0, Y)")
여기서 Y는 높이입니다 (fullhd 모니터의 경우 1080). (@lukeis에게 감사합니다)
당신은 또한 사용할 수 있습니다
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
스크롤 페이지 하단 .
당신이 원하는 경우 무한 로딩 페이지에 스크롤 소셜 네트워크 것과 같은, 페이스 북 등 (@Cuong 트란 덕분에)
SCROLL_PAUSE_TIME = 0.5
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 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:
break
last_height = new_height
Juanse 덕분에 다른 방법은 객체를 선택하고
label.sendKeys(Keys.PAGE_DOWN);
scrollHeight
그 의미는 무엇이며 일반적으로 어떻게 작동합니까?
무한 페이지의 맨 아래 로 스크롤 하려는 경우 (예 : linkedin.com) 경우이 코드를 사용할 수 있습니다.
SCROLL_PAUSE_TIME = 0.5
# Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 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:
break
last_height = new_height
SCROLL_PAUSE_TIME
에 따라 다름, 그것은 나를 위해 2 초 주위에 걸립니다.
element=find_element_by_xpath("xpath of the li you are trying to access")
element.location_once_scrolled_into_view
이것은 보이지 않는 'li'에 액세스하려고 할 때 도움이되었습니다.
location_once_scrolled_into_view
없이 호출해야 ()
IS location_once_scrolled_into_view
파이썬입니다 property
. 소스 코드는 여기를 참조하십시오 : d3b6ad006bd7dbee59f8539d81cee4f06bd81d64의 selenium / webelement.py · SeleniumHQ / selenium
이 답변 중 어느 것도 페이스 북 검색 결과 페이지를 스크롤 다운하지 않았지만 나에게 도움이되지는 않았지만이 솔루션을 많이 테스트 한 후에 발견되었습니다.
while driver.find_element_by_tag_name('div'):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
Divs=driver.find_element_by_tag_name('div').text
if 'End of Results' in Divs:
print 'end'
break
else:
continue
SCROLL_PAUSE_TIME
에 stackoverflow.com/a/27760083/7326714 에 2
, 그것은 잘 작동하고 당신은 빠른 속도로 100 배 아래로 스크롤합니다.
유튜브와 함께 작업 할 때 부동 요소는 그렇게하지 않고 사용하는 것보다 스크롤 높이와 같은 값 "0"줄 "document.body.scrollHeight를 돌려" 이 하나를 사용하여 시도 "document.documentElement.scrollHeight를 반환"을 인터넷에 따라 스크롤 일시 정지 시간을 조정 그렇지 않으면 속도는 한 번만 실행 된 후 중단됩니다.
SCROLL_PAUSE_TIME = 1
# Get scroll height
"""last_height = driver.execute_script("return document.body.scrollHeight")
this dowsnt work due to floating web elements on youtube
"""
last_height = driver.execute_script("return document.documentElement.scrollHeight")
while True:
# Scroll down to bottom
driver.execute_script("window.scrollTo(0,document.documentElement.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.documentElement.scrollHeight")
if new_height == last_height:
print("break")
break
last_height = new_height
동적 웹 페이지를 스크롤하는 방법을 찾고 있었고 페이지 끝에 도달하면 자동으로 중지 되어이 스레드를 찾았습니다.
@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
이 코드는 맨 아래로 스크롤되지만 매번 기다릴 필요는 없습니다. 계속 스크롤 된 다음 맨 아래 (또는 시간 초과)에서 중지됩니다.
from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get('https://example.com')
pre_scroll_height = driver.execute_script('return document.body.scrollHeight;')
run_time, max_run_time = 0, 1
while True:
iteration_start = time.time()
# Scroll webpage, the 100 allows for a more 'aggressive' scroll
driver.execute_script('window.scrollTo(0, 100*document.body.scrollHeight);')
post_scroll_height = driver.execute_script('return document.body.scrollHeight;')
scrolled = post_scroll_height != pre_scroll_height
timed_out = run_time >= max_run_time
if scrolled:
run_time = 0
pre_scroll_height = post_scroll_height
elif not scrolled and not timed_out:
run_time += time.time() - iteration_start
elif not scrolled and timed_out:
break
# closing the driver is optional
driver.close()
응답이 0.1 초가 걸릴 수있는 응답을 할 때마다 0.5-3 초를 기다리는 것보다 훨씬 빠릅니다.
로딩 페이지를 스크롤하십시오. 예 : 매체, quora 등
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);")
# Wait to load the page.
driver.implicitly_wait(30) # seconds
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# sleep for 30s
driver.implicitly_wait(30) # seconds
driver.quit()