現在、Selenium Webdriverを使用して、facebookのユーザーフレンドページを解析し、AJAXスクリプトからすべてのIDを抽出しています。しかし、私はすべての友人を得るために下にスクロールする必要があります。 Seleniumで下にスクロールするにはどうすればよいですか。私はpythonを使用しています。
使用できます
driver.execute_script("window.scrollTo(0, Y)")
ここで、Yは高さです(fullhdモニターでは1080です)。 (@lukeisに感謝)
使用することもできます
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
スクロールしてページの下部
必要な場合無限にロードされているページにスクロールする、ソーシャルネットワークのもの、facebookなど(@Cuong Tranに感謝)
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
無限ページの一番下までスクロールする場合( 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
from Selenium.webdriver.common.keys import Keys
html = browser.find_element_by_tag_name('html')
html.send_keys(Keys.END)
テスト済み、動作する
element=find_element_by_xpath("xpath of the li you are trying to access")
element.location_once_scrolled_into_view
これは、表示されていない「li」にアクセスしようとしたときに役立ちました。
Webページを下にスクロールする方法は次のとおりです。
driver.execute_script("window.scrollTo(0, 1000);")
これらの答えはどれも、少なくともFacebookの検索結果ページを下にスクロールするのには役立ちませんでしたが、このソリューションを何度もテストした結果、次のことがわかりました。
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
Youtubeを使用する場合、フローティング要素はスクロール高さとして値 "0"を与えるため、"return document.body.scrollHeight"を使用するのではなく、この値を使用してみてください"return document.documentElement。 scrollHeight "インターネット速度に応じてスクロール休止時間を調整します。そうしないと、1回だけ実行され、その後中断します。
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
動的なWebページをスクロールし、ページの最後に到達すると自動的に停止する方法を探していたところ、このスレッドが見つかりました。
@ Cuong Tran による投稿は、1つの主要な修正を加えて、私が探していた答えでした。この投稿は、他の人が修正が役立つと思うかもしれないと考えたためです(コードの動作に顕著な影響があります)。
変更は、最後のページの高さをキャプチャするステートメントを移動することですinside loop(各チェックが前のページの高さと比較されるように)。
したがって、以下のコード:
動的なWebページ(
.scrollTo()
)を継続的にスクロールダウンし、1回の反復でページの高さが同じままである場合にのみ停止します。
(別の変更があり、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
私の目的のために、ウィンドウの位置を念頭に置いて、さらに下にスクロールしたいと思いました。私の解決策は似ていてwindow.scrollY
を使用しました
driver.execute_script("window.scrollTo(0, window.scrollY + 200)")
現在のyスクロール位置+ 200に移動します
その問題を解決するために見つけた最も簡単な方法は、ラベルを選択して送信することでした:
label.sendKeys(Keys.PAGE_DOWN);
うまくいきますように!
このコードは下にスクロールしますが、毎回待つ必要はありません。継続的にスクロールし、下部で停止します(またはタイムアウトします)
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秒待機するよりもはるかに高速です。
読み込みページをスクロールします。例:ミディアム、クオラなど
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()