SeleniumヘッドレスChromeで返るページが実際と異なる場合の対策
Python × Selenium × ヘッドレスChromeでサイト巡回しようとして、こんな場合に直面したときの対策法について。
- 通常モードで起動すると、手動でブラウザでアクセスしたときと同じページコンテンツが表示され、要素取得が可能
- ヘッドレスモードで起動すると、明らかにBOT対策されているっぽいページコンテンツが返ってきて、要素取得が不可能
以下2つの方法でchromedriverにオプションを与えることで解決しました。
- "--headless=new"オプションを指定
- ユーザーエージェントオプションを指定
ー もくじ ー
Python SeleniumヘッドレスChromeで返るページが実際と異なる場合の対策
方法1の方が簡潔でカンタンなのでおすすめ。
方法1: "--headless=new"オプションを指定
4行目がポイント。
Pythonfrom selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless=new')
driver = webdriver.Chrome(options=options)
driver.get('https://google.com')
今まで以下のように旧記法で書いていたかたは上記記法を試してみてください。
options.add_argument('--headless')
options.headless = True
なお、'--headless=new'の記法を使うには、Chromeバージョンが109以上であることが必須です(最新を使っていれば問題なし)。
ちなみに:
chrome開発公式によると、この記法によりヘッドレスChromeの挙動がヘッドフルChrome(=通常のブラウザ)でアクセスする環境に限りなく近くなるとのこと。
参考
developer.chrome.com:
Chrome’s Headless mode gets an upgrade: introducing --headless=new
これでもダメな場合、以下方法2を重ねて実行してみてください。
方法2: ユーザーエージェントオプションを指定
3・7行目がポイント。
Pythonfrom selenium import webdriver
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument(f'user-agent=user_agent')
driver = webdriver.Chrome(options=options)
driver.get('https://google.com')
この方法でも、正常なコンテンツ取得が可能になりました。
user agent checkとググると検索結果の先頭に現在使用中のブラウザのユーザーエージェントが表示されるのでご参考までに。
表示された文字列をすべてコピーし、変数user_agentを置き換えます。
ユーザーエージェントは偽装できるので、上記コードのユーザーエージェントのまま実行しても動作します。