Seleniumでのスクレイピングプログラムを作成していたところ、実際にブラウザ起動時はちゃんとスクレイピングできていたにも関わらず、ヘッドレスモードに切り替えた時だけページの取得が上手くできない事象に遭遇したので、解決法をメモしておきます。
具体的にはGoogleChromeのヘッドレスモードでdriver.get()でサイトにアクセスした際、Javascriptの非同期処理で表示されている部分がうまくレンダリングされないケースがあり、ページのbodyタグが空だったり一部のコンテンツが表示されないことがあります。
解決法
FireFoxを使う
ブラウザを起動させる場合だとプログラムは正常に動作していて、Chromeのヘッドレスモードにするとプログラムをうまく動作しなくなる場合はFireFoxに切り替えるとうまくいく可能性があります。
コードは以下のような感じです
<SeleniumでFireFoxをヘッドレスモードで起動するサンプルコード>
from selenium import webdriver from selenium.webdriver import FirefoxOptions # 追加 from selenium.webdriver.support.ui import WebDriverWait options = webdriver.FirefoxOptions() # オプションもfirefox用に変更、記述方法に変更はほぼ無し options.add_argument("--headless") # ヘッドレスモード指定 options.add_argument("--no-sandbox") driver = webdriver.Firefox(options=options) # ここでfirefoxを起動するように変更 url = "https://twitter.com/home" # 例でTwitterのURL # サイトにアクセス driver.get(url) # ヘッドレスモードで表示されている画面のスクショを取得 driver.get_screenshot_as_file('screenshot.png') # ブラウザーを終了 driver.quit()
これでも症状が変わらない場合はサイトのBOT判定などに引っ掛かっている可能性をあると思います
では~
コメント