Seleniumとは?
Webブラウザ操作を自動化するためのツールでPythonライブラリとは別に準備されています。主にWebアプリのテストや、Webスクレイピングに使われます。
BeautifulSoup+ Requestとの比較
最近は無限スクロール(初期レンダリングで全てのデータが描画されず、スクロールするたびに描画されていく方式)のサイトが多いです。そうした無限スクロールにはJavaScriptの技術が使われておりどうしても静的なDOM操作だけでは対応できません。
そうした場合であっても、Seleniumによる自動クローリングで実際のDOM操作を再現する手法を使えば情報を取得することが可能になります。
対応ブラウザ
様々なブラウザに対応しています。現状はChromeで使っていけば良いでしょう。
セットアップの流れ
以下のステップが必要になります。
- Selenium本体をダウンロードする。
- PythonライブラリのSeleniumをインストールする。
- Pythonで使えるようにする。
ツールのSeleniumのダウンロード
まずは自分のChromeのバージョンを確認しましょう。(「Google Chromeについて」から確認できます。)
一応、上記が公式サイトにはなるのですが公式のバージョンでは若干古い場合があります。Webで「chromedriver バージョン番号」と検索して自分のChromeと同じバージョンのChrome Webドライバーをダウンロードしましょう。
PythonのSeleniumライブラリをインストールする。
1 2 3 |
conda install selenium or pip install selenium |
クローリングのサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from time import sleep from selenium import webdriver from selenium.webdriver.chrome.options import Options # Chromeドライバーをダウンロードしたパスを記述 chrome_driver_path = 'User/xxx/chromedriver' options = Options() # Chromeをシークレットモードで起動する。 options.add_argument('--incognito') driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options) driver.get('https://yahoo.co.jp') sleep(5) driver.quit() |
ちなみに、上記サンプルではChromeドライバーのパスを指定していますが、実行コードと同じ階層にWebDriverを配置すればパスを指定しなくても実行できるのでそちらの方が早いかもしれません。
クローリングとスクレピングの違い
クローリングはブラウザを自動で立ち上げて実際に自動操作を行わせる一連の流れのことを言います。それに対してスクレイピングはWebから情報を取得することを指します。微妙に違うので単語の違いを抑えておきましょう。
検索する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from time import sleep from selenium import webdriver from selenium.webdriver.chrome.options import Options # Chromeドライバーをダウンロードしたパスを記述 chrome_driver_path = '/Users/xxx/chromedriver' options = Options() options.add_argument('--incognito') driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options) driver.get('検索サイトのURL') sleep(3) search_box = driver.find_element_by_class_name('class名') # りんごと検索します。 search_box.send_keys('りんご') search_box.submit() sleep(3) driver.quit() |
sleep(3)
待機します。クローリングは実際のブラウザを使ってサイトの情報を読み込むので完全に読み込み終えるまでの待ち時間が発生します。
find_element_by_class_name
CSSのclass名でelementにアクセスができます。なお、他にもCSSセレクタを使って要素を特定することも可能です。
無限スクロールにおいてスクロールする
書き方1:ブラウザのスクロールメソッドを利用する。
前提として検索結果が出ているコードに対して実行する必要があります。
1 2 3 4 5 6 |
height = 300 while height < 2000: driver.execute_script("window.scrollTo(0, {});".format(height)) height += 100 sleep(1) |
初期値を300として高さ2000まで徐々にスクロールさせるサンプルコードです。要件に応じて変数の値は適宜いじったりして調整をする必要があります。
driver.execute_script
上記構文でJavaScriptを実行することができます。ループをさせて徐々にスクロールさせています。
書き方2:Endキーでキーボード操作でスクロールする。
1 2 3 4 5 6 |
from selenium.webdriver.common.keys import Keys scroll_count=10 for i in range(scroll_count): driver.find_element_by_tag_name('body').send_keys(Keys.END) sleep(1) |
このような書き方もあります。サンプルでは「Keys.END」を使っていますが、「Keys.PAGE_DOWN」でないとうまく動かないページもあります。
その他メソッド
1 |
find_element_by_tag_name('タグ名') |
HTMLのタグ名(例:imgタグなど)で要素を取得できます。
1 2 3 |
get_attribute('属性名') |
取得した要素に対して属性を指定して取得できます。
ヘッドレスモードで実行する
1 2 3 4 5 6 7 8 9 |
from selenium import webdriver from selenium.webdriver.chrome.options import Options # Chromeドライバーをダウンロードしたパスを記述 chrome_driver_path = 'User/xxx/chromedriver' options = Options() options.add_argument('--headless') driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options) |
ヘッドレスモードはブラウザ操作を非表示にして実行するモードです。途中の実行状態は確認できませんが、その分早く実行できるのがメリットになります。
オプション一覧
--headless | ヘッドレスモード | 基本こちらの方が若干早いらしいです。ただ、もしスクレイピングにダウンロード操作などがある場合はヘッドレスだと無理です。 |
--incognito | シークレットモード | |
--disable-gpu | GPUの無効化 | headlessモードで必要な暫定的なフラグ。こちらの方が安定するらしいです。 |
--disable-extensions | 拡張機能の無効化 | スクレイピング時に不用意にChrome拡張機能が動作しないようOFFにするようにしましょう。 |
--proxy-server='direct://' | プロキシサーバーの設定 | Proxy経由ではなく直接接続する。 |
--proxy-bypass-list=* | プロキシサーバーの設定 | 全てのホスト名 |
--start-maximized | ウインドウサイズの最大化 | 起動時にウインドウサイズを最大化する。 |
add_experimental_option
"excludeSwitches", ["enable-logging"] | 「システムに接続されたデバイスが機能していません」を消す |
通常モード
履歴(検索履歴、閲覧履歴、閲覧時間)、Cookie、キャッシュ画像、ダウンロードしたデータ、ログイン情報、入力情報(キーボード履歴)が記録が端末内のアプリやアカウントに保存されます。
シークレットモード
アプリなどを閉じると履歴(検索履歴、閲覧履歴、閲覧時間)、Cookie、キャッシュ画像、ダウンロードしたデータ、ログイン情報、入力情報が保存されず破棄される。ただし「キーボードの入力履歴(過去に検索で利用した入力候補など)」だけは残ります。
お気に入り、リーディングリスト、視聴履歴、検索履歴、保存、いいね等が利用できなくなります。
セッションごとに情報が保持され、セッションが切れると破棄されます。
「シークレットモード」よりも「ゲストモード」の方が過去にアクセスしたURLが表示されないので安全です。
利用できるアプリ
Chrome、Edgeなどのブラウザアプリ、Youtubeでも利用できます。
ゲストモード
PCのみしか使えないです。過去に入力したURLが表示されないのでシークレットモードより安全です。
この記事へのコメントはありません。