PythonのSeleniumパッケージを使ってChromeを自動操作できることがわかりましたが、Chromeはユーザの操作履歴によってGoogle検索のランキングが変わるという特性があります。ここでは履歴情報を使わないPythonによるシークレットモードでChromeを起動する方法を紹介します。
こんにちは。wat(@watlablog)です。
SeleniumによるChromeブラウザ自動操作をしている人は是非知っておきたい、Pythonによるシークレットモードでブラウザを自動操作する方法を紹介します!
Chromeの情報収集はシークレットモードの方が断然良い2つの理由
①情報が偏らない
Google Chrome(通称Chrome)というブラウザはPCだけでなく、スマホやタブレット端末でも世界中で多くの方が使っています。
そしてこのChromeは様々なユーザに合わせてブラウザを使いやすくする機能が付いています。
例えばあなたがChromeを使っていると、普段閲覧しているWebサイトのジャンル、ダウンロードしたファイル、キャッシュ、SNSやECサイトへのログインID…といった様々な情報がPCやスマホ、タブレット端末のメモリに保存されていきます。
その情報を元にChromeはよりあなたに適した情報を迅速に届けようとするわけです。
しかし、情報収集として広く世間の情報を公平に判断したい時にこの機能は単なるおせっかいになってしまいます。
Google検索で特定のワードの検索順位を調べたい時に、自分の趣味嗜好が反映されたデータはノイズを含んでいるのと同じです。
そんな時、シークレットモードであればそれら履歴情報を使わず、さらに溜め込まずというユーザによる偏りの無い動作を行うことができることがメリットです。
②プログラム的な誤動作の可能性が低い
通常のChromeはSNS等のログイン情報も保存することが出来てしまいます。
誰しも普段利用するサイト(Amazon等)にアクセスしたら、既にログインIDが打ち込まれていたという経験があることと思います。あれは妖精さんではなく、ブラウザの仕業です。
普段使いであれば大変便利な機能(セキュリティ上は疑問ですが)と思いますが、ことプログラムで自動操作をしようとした時は話が違います。
Python等のプログラムでWebブラウザを自動操作する時、「PythonでGoogle検索タイトルとURL一覧を抽出してみた」で処理していたように、class, id, name, tag_name等を使ってHTMLを分析することになります。
ここで、予めフォームに何か入力された文字がある場合、それを知らないで.send_keysをしてしまうと、文字列が連結されてしまう等の動作をしてしまいます。
そのような場合は一度フォームをクリアして…と前処理をしないとエラーになったり、誤った目的のデータを分析してしまうことにもなりかねません。
入力フォーム意外にも何かあるかも知れません(Googleのアップデートでどんな機能が追加されるかはわかりませんし)。
Chromeのシークレットモードであればこの問題も解決することができますので、プログラム的にイレギュラーな応答の可能性を低くするメリットもあります。
PythonでChromeをシークレットモードで起動するコード
シークレットモードはオプションで指定する
Google Chromeをシークレットモードで起動するコードはとても簡単です。
以下のコードはimport文からwebdriverを用意する部分までのものですが、まずimportでOptionsを読み込み、add_argument関数で引数に'--incognito'を指定します。その後、webdriver.Chromeでオプション指定するだけです。
1 2 3 4 5 6 7 8 |
import time # スリープを使うために必要 from selenium import webdriver # Webブラウザを自動操作する(python -m pip install selenium) import chromedriver_binary # パスを通すためのコード from selenium.webdriver.chrome.options import Options # オプションを使うために必要 option = Options() # オプションを用意 option.add_argument('--incognito') # シークレットモードの設定を付与 driver = webdriver.Chrome(options=option) # Chromeを準備(optionでシークレットモードにしている) |
例)シークレットモードでWebスクレイピングをするコード
それではシークレットモードを使ったプログラミングの例を以下に示します。
以下のコードは「PythonでGoogle検索タイトルとURL一覧を抽出してみた」のコードをシークレットモードにしただけです。この記事にはPython環境や各種パッケージのインストールについての説明も記載しましたので、是非そちらも読んでみて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import time # スリープを使うために必要 from selenium import webdriver # Webブラウザを自動操作する(python -m pip install selenium) import chromedriver_binary # パスを通すためのコード from selenium.webdriver.chrome.options import Options # オプションを使うために必要 option = Options() # オプションを用意 option.add_argument('--incognito') # シークレットモードの設定を付与 driver = webdriver.Chrome(options=option) # Chromeを準備(optionでシークレットモードにしている) # サンプルのHTMLを開く driver.get('https://www.google.com/') # Googleを開く search = driver.find_element_by_name('q') # HTML内で検索ボックス(name='q')を指定する search.send_keys('WATLABブログ') # 検索ワードを送信する search.submit() # 検索を実行 time.sleep(3) # 3秒間待機 def ranking(driver): i = 1 # ループ番号、ページ番号を定義 i_max = 2 # 最大何ページまで分析するかを定義 title_list = [] # タイトルを格納する空リストを用意 link_list = [] # URLを格納する空リストを用意 # 現在のページが指定した最大分析ページを超えるまでループする while i <= i_max: # タイトルとリンクはclass="r"に入っている class_group = driver.find_elements_by_class_name('r') # タイトルとリンクを抽出しリストに追加するforループ for elem in class_group: title_list.append(elem.find_element_by_class_name('LC20lb').text) #タイトル(class="LC20lb") link_list.append(elem.find_element_by_tag_name('a').get_attribute('href')) #リンク(aタグのhref属性) # 「次へ」は1つしかないが、あえてelementsで複数検索。空のリストであれば最終ページの意味になる。 if driver.find_elements_by_id('pnnext') == []: i = i_max + 1 else: # 次ページのURLはid="pnnext"のhref属性 next_page = driver.find_element_by_id('pnnext').get_attribute('href') driver.get(next_page) # 次ページへ遷移する i = i + 1 # iを更新 time.sleep(3) # 3秒間待機 return title_list, link_list # タイトルとリンクのリストを戻り値に指定 # ranking関数を実行してタイトルとURLリストを取得する title, link = ranking(driver) # タイトルリストをテキストに保存 with open('title.txt', mode='w', encoding='utf-8') as f: f.write("\n".join(title)) # URLリストをテキストに保存 with open('link.txt', mode='w', encoding='utf-8') as f: f.write("\n".join(link)) driver.quit() # ブラウザを閉じる |
このコードを実行すると、Google Chromeが自動で立ち上がってページを遷移するクローリングを行います。
そして、先ほど紹介した記事の結果とはChromeの色が黒くなっている点が違います。この黒色こそがシークレットモードの証拠です。
まとめ
このページではPythonのSeleniumで操るGoogle Chromeをシークレットモードで起動する方法を紹介しました。
シークレットモードは偏りの無い情報を収集することができ、予期せぬエラーの可能性を低くすることもできる等メリットが沢山ありますね。
Chromeのオプション指定の方法を習得しました!他にもオプションが色々ありそうですね!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!