質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

3101閲覧

【Python】selenium + headless Chromeでヘッダにパラメタを付与したい

recter

総合スコア37

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2018/03/08 16:18

編集2018/03/08 16:20

SeleniumのPhantomJSサポート終了に伴い、
以前作成したWEBスクレイピングのソースをheadless Chromeを使用したものに修正を行っています。

アクセス行うサイトではベーシック認証が行われており、
PhantomJSを使っていた時にはヘッダにBASE64エンコードした認証情報を付与してページの情報を取得しておりました。
しかし、headless Chromeを使用してヘッダに情報を付与する方法がわからないため、
行き詰っております。
ご存知の方がいらっしゃいましたら、教えていただきたいです。

もともとのソース

Python

1import base64 2from selenium import webdriver 3 4# PhantomJS 5def getHogePage(): 6 userId = 'moge_moge' 7 password = 'passward' 8 9 #IDとパスワードをベーシック認証用に整形 & BASE64エンコード 10 s = userId + ":" + password 11 en_str = str(base64.b64encode(s.encode('utf-8'))) 12 13 # ヘッダーに認証情報を突んで driver生成 14 webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format('authorization')] = "Basic " + en_str[2:-1] 15 driver = webdriver.PhantomJS(service_log_path=os.path.devnull) 16 17 # アクセスするURL 18 url = "http://hoge.hogemoge.co.jp/membertop.html" 19 20 # URLを読み込み 21 driver.get(url) 22 res = driver.page_source 23 24 print(res)

改修中ソース

Python

1 2import base64 3from selenium import webdriver 4from selenium.webdriver.chrome.options import Options 5 6# headless Chrome 7def getHogePage(): 8 userId = 'moge_moge' 9 password = 'passward' 10 11 #IDとパスワードをベーシック認証用に整形 & BASE64エンコード 12 s = userId + ":" + password 13 en_str = str(base64.b64encode(s.encode('utf-8'))) 14 15  options = Options() 16  options.add_argument('--headless') 17  options.add_argument('--disable-gpu') 18  options.add_argument('--window-size=1024,768') 19 20 #認証情報をヘッダーに入れたい 21 #webdriver.DesiredCapabilities.CHROME[ここになにか書く?] = "Basic " + en_str[2:-1] 22 23 driver = webdriver.Chrome(chrome_options=options) 24 25 # アクセスするURL 26 url = "http://hoge.hogemoge.co.jp/membertop.html" 27 28 # URLを読み込み 29 driver.get(url) 30 res = driver.page_source 31 32 print(res) 33

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ChromeDriver 固有の機能は以下の辺りで解説されておりますが、 PhantomJS 同様な「任意のカスタムヘッダをリクエストに付与する」機能は用意されていないようですね。残念ながら。

ではどうするかですが、目的が Basic 認証のページにアクセスする ことだけならば、カスタムヘッダという機能に拘らずとも、恐らく以下のような選択肢が利用できると思われます。

  1. 認証情報を URL に含める
  2. 自動で認証情報を入力する Chrome 拡張を作り、インストールする

1 は通常のブラウザ利用時にも使える方法ですが、 URL には、今回御呈示のソースで言えば http://moge_moge:passward@hoge.hogemoge.co.jp/membertop.html という形で認証情報を含めることが出来ます。一度これで認証を通せば、後は Chrome 自身が認証情報をキャッシュして利用可能になると思うので、多分一番お手軽です。

※但し、 Chrome 60 では バグがあってこの方法が使えない という話もあるようなので、 Chrome のバージョンが古いようでしたら更新しておいて下さい

2 は ここの Stackoverflow 回答 にて、 1 以外の方法として実際の拡張の gist と共に提案されているもので、onAuthRequired イベントハンドラで自動的に認証を返す小さな Chrome Extension を作ってしまい、それを Options.add_extension() でインストールしておくという手法です。
少し遠回りにも見えますが、認証失敗時には自動でキャンセルする実装にもなっているようなので、 Headless でない場合も安心して使える (認証失敗時、 Headless でない場合は認証ダイアログがでて止まり得る) という利点があるように思います。

尚、どうしても 任意のカスタムヘッダを付与したい という要望があるならば、 2 の手法を拡張して 任意のヘッダを付与する Chrome 拡張を自動生成する Pythonコードで実現している人 も居るようです。認証以外で必要な場合は御検討下さい。

投稿2018/03/09 03:49

argparse

総合スコア1017

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問