PythonSeleniumを介してWebページから読み込みに時間がかかるHTMLを取得する

jmcph4

BitMEXからCSVのリストを抽出しようとしています。ページは、ディレクトリの実際のインデックスをレンダリングするために、いくつかの(ロードがかなり遅い)Javascriptを実行します(なぜこれを選択したのか、私を超えています-おそらく難読化されていますか?)。

SeleniumのPython言語バインディングを使用する次のPython3.xコードがあります。

#!/bin/python3

import datetime
from urllib import request
import sys
from sys import argv
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options

DOM_LOAD_WAIT = 60
COMMENT_CHAR = '#'

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

def get_html(url):
    # configure headlessness for the webdriver
    options = Options()
    options.headless = True
    
    driver = webdriver.Chrome(options=options)
    driver.implicitly_wait(DOM_LOAD_WAIT)

    # constantly retry until success
    while True:
        try:
            driver.get(url)
            break
        except KeyboardInterrupt:
            exit(1)
        except:
            eprint("Retrying \"{}\"...".format(url))
            continue

    return driver

def get_results(url):
    driver = None

    try:
        driver = get_html(url)
        element = WebDriverWait(driver, DOM_LOAD_WAIT).until(
            EC.presence_of_element_located((By.TAG_NAME, "pre"))
        )
    finally:
        driver.quit()

    print(driver.find_elements_by_tag_name("a"))

if __name__ == "__main__":
    url = "https://public.bitmex.com/?prefix=data/quote/"
    get_results(url.strip())
    print("", end=None, flush=True) # flush stdout!


問題は、スクリプトが、私が求めている最終的なページソースではなく最初のページソースを取得することです(つまり、Javascriptが完全に実行された後、時間がかかる場合があります)。

$ ./script.py
<html><head>
  <title>public.bitmex.com</title>
  <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src 'self'; connect-src https://s3-eu-west-1.amazonaws.com; script-src 'sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7' 'sha384-n0cKBy1+1+ACIC9J2XunFZItQjpIi1bilP1FCayDxybB40OcUY1ipK4Qjr856KWI' 'sha384-Rncjr7coAsbMCINMdkum6h64TPVhqlDpqulDQB/a68yABAgOU21duBLDdlm86oKP'; child-src 'none'; object-src 'none'; require-sri-for script style; block-all-mixed-content;">
</head>
<body>
  <div id="navigation"></div>
  <div id="listing"><img src="//public.bitmex.com/ajaxload-circle.gif"></div>

  <script type="text/javascript" src="https://public.bitmex.com/jquery.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script>
  <script type="text/javascript" src="https://public.bitmex.com/init.js" integrity="sha384-n0cKBy1+1+ACIC9J2XunFZItQjpIi1bilP1FCayDxybB40OcUY1ipK4Qjr856KWI" crossorigin="anonymous"></script>
  <script type="text/javascript" src="https://public.bitmex.com/list.js" integrity="sha384-Rncjr7coAsbMCINMdkum6h64TPVhqlDpqulDQB/a68yABAgOU21duBLDdlm86oKP" crossorigin="anonymous"></script>


</body></html>

具体的には、回転するローディングホイールのGIFのみを取得しますが、これは(言うまでもなく)非常に苛立たしいことです。

Javascriptが完全に実行された後にのみWebドライバーが制御を返すようにするにはどうすればよいですか?

コンテンツセキュリティポリシーの実装に一貫性がないため、ChromiumベースのWebドライバーを使用する必要があることに注意してください。

ミッチェルオリスラガーズ

「最終変更日」というテキストが見つかるまで、ドライバードライバーを待機させることができます。

def get_results(url):
    driver = None

    try:
        driver = get_html(url)
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Last Modified')]")))
    finally:
        driver.quit()

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Brightcoveビデオのページへの読み込みに時間がかかっている場合は、読み込み中の画像を表示します

分類Dev

読み込みに時間がかかるウェブページからデータを取得する際の問題

分類Dev

読み込みに非常に長い時間がかかるWebページ

分類Dev

ページの読み込み時に新しい入力要素から値を取得する

分類Dev

ページの読み込み時にJQUERYを介してSelectList値を取得する

分類Dev

動的読み込みを使用するページからのAjax読み込み

分類Dev

ページの読み込み時にajax応答を取得しますか?

分類Dev

ページの読み込み時にajax応答を取得しますか?

分類Dev

Javascript Built AppsのWebページの読み込み時間を改善する方法はありますか?

分類Dev

Chromeコンソールウィンドウとコンソールコマンドを使用してWebページの読み込み時間を取得するにはどうすればよいですか?

分類Dev

ページが30秒間読み込まれない場合に、Webビューを停止して、再読み込みメッセージを表示するにはどうすればよいですか?

分類Dev

Axiosを使用するNuxtは、ページの読み込み時にAPIからデータを取得しません

分類Dev

ページの読み込み時にチェックボックスがすでにオンになっているかどうかを確認します

分類Dev

最初のページの読み込み時にのみページが未定義の変数を取得するのはなぜですか?

分類Dev

最初のページの読み込み時にdivが誤って読み込まれるのを防ぐにはどうすればよいですか?

分類Dev

最初のページの読み込み時にdivが誤って読み込まれるのを防ぐにはどうすればよいですか?

分類Dev

Seleniumを使用したCapybaraは、ページの読み込みに時間がかかりすぎて、Net :: ReadTimeoutエラーが発生します

分類Dev

ページに読み込み時間を表示する

分類Dev

vuejsを使用してページを読み込むときにFirebaseからデータを取得するにはどうすればよいですか?

分類Dev

Android:HTMLの読み込みにかかる時間を測定する方法は?

分類Dev

window.openを使用して新しいページに直接HTMLを書き込んでいるときに、ページの「読み込み」が完了したことをブラウザに知らせるにはどうすればよいですか?

分類Dev

ページの再読み込み時にオプションが選択されているかどうかを確認します

分類Dev

Selenium-Angular 2+でWebページの読み込みが終了したかどうかを確認する

分類Dev

ページの読み込み時にlocalStorage値を取得する

分類Dev

値がページの読み込み時に存在する場合、datetimepickerが入力から値を消去します

分類Dev

ページが読み込まれてから2秒後にdivを表示する必要があります

分類Dev

Flaskで時間のかかる関数が実行されている間に「読み込み中」のメッセージを表示する

分類Dev

Flaskで時間のかかる関数が実行されている間に「読み込み中」のメッセージを表示する

分類Dev

ウェブページが完全に読み込まれるまでに遅延が必要なURLからHTMLコードを取得する

Related 関連記事

  1. 1

    Brightcoveビデオのページへの読み込みに時間がかかっている場合は、読み込み中の画像を表示します

  2. 2

    読み込みに時間がかかるウェブページからデータを取得する際の問題

  3. 3

    読み込みに非常に長い時間がかかるWebページ

  4. 4

    ページの読み込み時に新しい入力要素から値を取得する

  5. 5

    ページの読み込み時にJQUERYを介してSelectList値を取得する

  6. 6

    動的読み込みを使用するページからのAjax読み込み

  7. 7

    ページの読み込み時にajax応答を取得しますか?

  8. 8

    ページの読み込み時にajax応答を取得しますか?

  9. 9

    Javascript Built AppsのWebページの読み込み時間を改善する方法はありますか?

  10. 10

    Chromeコンソールウィンドウとコンソールコマンドを使用してWebページの読み込み時間を取得するにはどうすればよいですか?

  11. 11

    ページが30秒間読み込まれない場合に、Webビューを停止して、再読み込みメッセージを表示するにはどうすればよいですか?

  12. 12

    Axiosを使用するNuxtは、ページの読み込み時にAPIからデータを取得しません

  13. 13

    ページの読み込み時にチェックボックスがすでにオンになっているかどうかを確認します

  14. 14

    最初のページの読み込み時にのみページが未定義の変数を取得するのはなぜですか?

  15. 15

    最初のページの読み込み時にdivが誤って読み込まれるのを防ぐにはどうすればよいですか?

  16. 16

    最初のページの読み込み時にdivが誤って読み込まれるのを防ぐにはどうすればよいですか?

  17. 17

    Seleniumを使用したCapybaraは、ページの読み込みに時間がかかりすぎて、Net :: ReadTimeoutエラーが発生します

  18. 18

    ページに読み込み時間を表示する

  19. 19

    vuejsを使用してページを読み込むときにFirebaseからデータを取得するにはどうすればよいですか?

  20. 20

    Android:HTMLの読み込みにかかる時間を測定する方法は?

  21. 21

    window.openを使用して新しいページに直接HTMLを書き込んでいるときに、ページの「読み込み」が完了したことをブラウザに知らせるにはどうすればよいですか?

  22. 22

    ページの再読み込み時にオプションが選択されているかどうかを確認します

  23. 23

    Selenium-Angular 2+でWebページの読み込みが終了したかどうかを確認する

  24. 24

    ページの読み込み時にlocalStorage値を取得する

  25. 25

    値がページの読み込み時に存在する場合、datetimepickerが入力から値を消去します

  26. 26

    ページが読み込まれてから2秒後にdivを表示する必要があります

  27. 27

    Flaskで時間のかかる関数が実行されている間に「読み込み中」のメッセージを表示する

  28. 28

    Flaskで時間のかかる関数が実行されている間に「読み込み中」のメッセージを表示する

  29. 29

    ウェブページが完全に読み込まれるまでに遅延が必要なURLからHTMLコードを取得する

ホットタグ

アーカイブ