サーバいじくり雑記

2014年12月17日

py-selenium+phantomjsでUser-Agentを設定する

Filed under: 開発技術, Python, Web — bompopo @ 1:16 PM

はー、未だ謎多きpy-selenium+phantomjsです。
とりあえず一つの問題が案外簡単にクリアできたのでメモ。

最近私の頭を痛めていた問題に、「新しいウィンドウを生成するような動作(target=_blankなaをクリック等)をした時、その新しいウィンドウに設定したはずのUAが反映されない」というのがありました。

phantomjsにデバッグ出力オプションをつけて眺めていたところ以下な感じに処理されているようでした。(かなり省いてます)

_addNewPage               <-- 新しいウィンドウつくる!
page.settings             <-- phantomjs.page.settings. に定義されている値が設定される
                                                      (UA定義なければphantomjsデフォ)
page.customHeaders        <-- phantomjs.page.customHeaders. に定義されている値が設定される
                                                           (定義なければデフォなにもしない)
page.onResourceRequested  <-- phantomjs.page.customHeaders. に定義されている値が設定されるが、
                                                            定義なければphantomjsのデフォ値が設定される

つまり、世に出回っている「phantomjs.page.settings.userAgent」への設定だけでは、新しいウィンドウ作った時には「onResourceRequested」にて「phantomjsのデフォ設定値」で上書きされてしまうのです(ナンデ。

最初は「onResourceRequested」で使われる値がなにかわからなかったのですが(ソースざっと読んでも分からなかったorz)、試しに「customHeaders」に設定したところ「onResourceRequested」にても同設定値が使用されていました。

確認したphantomjsのバージョンは1.9.8なのですが、恐らくこの動作は仕様ではないのではないでしょうか。今後動作が変わる気がします。

結局以下のようにするのが今の所(ver1.9.8)ではスマートで鉄板ということに。

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

ua_value = 'Mozilla/5.0 (X11; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0 Iceweasel/34.0'

dcap = DesiredCapabilities.PHANTOMJS
dcap['phantomjs.page.settings.userAgent'] = ua_value
dcap['phantomjs.page.customHeaders.User-Agent'] = ua_value

driver = webdriver.PhantomJS( desired_capabilities=dcap )

#以降処理

追記:いや、selenium側の問題の可能性も?

広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。