web-dev-qa-db-ja.com

Python

私はPythonをSeleniumとPhantomJSで取得して、動的にロードする無限スクロールページを次の例のようにリロードすることに成功しました。しかし、これを変更して、リロードの数を手動で設定する代わりに、 、ロックボトムに到達したときにプログラムが停止しましたか?

reloads = 100000 #set the number of times to reload
pause = 0 #initial time interval between reloads
driver = webdriver.PhantomJS()

# Load Twitter page and click to view all results
driver.get(url)
driver.find_element_by_link_text("All").click()

# Keep reloading and pausing to reach the bottom
for _ in range(reloads):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(pause)

text_file.write(driver.page_source.encode("utf-8"))
text_file.close()
19
DIGSUM

スクロールがすべてのステップで何かを行ったかどうかを確認できます。

_lastHeight = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(pause)
    newHeight = driver.execute_script("return document.body.scrollHeight")
    if newHeight == lastHeight:
        break
    lastHeight = newHeight
_

これは静的な待機量を使用します。静的な待機量を使用するのは、処理が速くなったときに不必要に待機したくないし、動的な負荷が何らかの理由で遅すぎるときにスクリプトが途中で終了したくないからです。

通常、ページはいくつかの要素をリストに読み込むので、読み込む前にリストの長さを確認し、次の要素が読み込まれるまで待つことができます。

Twitterの場合、これは次のようになります。

_while True:
    elemsCount = browser.execute_script("return document.querySelectorAll('.stream-items > li.stream-item').length")

    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    try:
        WebDriverWait(browser, 20).until(
            lambda x: x.find_element_by_xpath(
                "//*[contains(@class,'stream-items')]/li[contains(@class,'stream-item')]["+str(elemsCount+1)+"]"))
    except:
        break
_

XPath式を使用しました。PhantomJS1.xには、:nth-child() CSSセレクターを使用するとバグが発生する場合があるためです。

フルバージョン 参考用。

30
Artjom B.