事象
あるサービスから、WebスクレイピングしてデータをExcelに出力するプログラムを作ってる時、実行環境や実行タイミングによって、Excelに出力された値が異なる事象が発生。
データを取得する画面は、同じで、一度発生するとその特定のレコードが毎回画面上の値と異なって出力される。
当記事は、この問題に対する調査記録。
事象整理
まずは事実を整理。
- 実行する環境(PC)によって、Excelに出力された値(取得された値)が異なる事象が発生する
- 事象が発生するデータと同じ画面から取得したデータは、そのような事象は発生しない
⇒画面項目差異による影響ではない - デバッグ実行しながらであれば、事象は発生しない(通しで実行した時にのみ発生する)
⇒プログラムが悪さしているわけではなさそう - 事象が発生するデータのみを対象にすると事象は発生しない
⇒対象データが悪いわけではない - ヘッドレスモードで起動したときは正常に取得される
(ようにみえる。タイミングによって発生する可能性があるため)
⇒プログラムが悪さしているわけではなさそう
プログラムの内容
プログラムが原因ではなさそうなので、Seleniumに関わる箇所のみにフォーカスする。
- SeleniumWebDriverの起動オプションは以下。
options = EdgeOptions() options.use_chromium = True options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_argument("--inprivate") options.add_argument("--disable-cache")
- 不完全なページのロードを回避するため、画面遷移後に3秒待機。
また、implicity_waitを設定し、上記で3秒待機後に画面最下部の要素が発見されてから処理を実行 - 画面遷移はSeleniumWebdriver、データの取得はBeautifulSoupを利用
試したこと
事象発生の要因に対して、それぞれ調査。
-
【仮説1】ページがロードしきってない状態で処理が走ってしまった?
【アプローチ】画面遷移後の待機時間を6秒に延長してみる
【結果】事象解消せず。次の仮設を検証してみる。 -
【仮説2】処理中にたまったゴミが悪さをしている?
【アプローチ】webdriverの利用ディレクトリを指定して、どんな感じかを観察してみる。
EdgeOptionsに以下を設定。options.add_argument("user-data-dir=D:\\SeleniumTest\\")
【結果】特に怪しい箇所なし。次の仮設を検証してみる。
→結果、変わらず。また、処理終了後に上記ディレクトリのデータも消えなかった。 -
【仮説3】Edgeの拡張機能が悪さをしてたりする?
【アプローチ】拡張機能が悪さしている可能性もあるので、無効にして起動してみる
EdgeOptionsに以下を設定。options.add_argument("--disable-extensions")
【結果】結果変わらず。
結論
色々試したけど、画面表示しながら事象を解消することはできず!
画面表示していることでリソースを消費して、画面のロードに不都合が発生しているのかも・・・
ヘッドレスモードで起動することで今のところちゃんと出力されそうなので、こちらで対応することにする。