【Python】Selenium:Ajax非同期通信を特殊キー送信で実行させる

時計 2021.02.09 / 時計

【Python】Selenium:Ajax非同期通信を特殊キー送信で実行させる

本記事ではPythonのSeleniumを使用した、特殊キーを送信してAjax非同期通信を実行させる方法について解説していきます。

現在ではほとんどのWebサイトでJavaScriptが使われています。
単にJavaScriptを使っているサイトだけでなく、JavaScriptのフレームワークjQueryを使ったサイトや、非同期通信を実現するAjaxを使ったサイトなどが多く普及しています。

スクレイピングによるデータ収集を行うならば、JavaScriptが使われているサイトやAjaxによる非同期通信を使用したサイトからもデータを取得する術を知っておく必要があります。

Ajaxによるサーバーとの非同期通信を実行させるために本記事ではSeleniumを使用します。
Seleniumについては以下記事をご参照ください。

本記事を通して以下の知識を学べます。

学べる知識
  • スクレイピングでJavaScriptを実行させる理由
  • Seleniumによる特殊キー送信方法
  • SeleniumでAjaxを実行させる方法

JavaScriptを実行させる理由

スクレイピングとは、インターネット上の様々なWebサイトから自動的に数多くの情報を集める手法です。

このスクレイピングで注意しなければならないことの一つとして、
JavaScriptやjQuery、Ajaxを使用している動的サイトでは、JavaScriptを実行させた後でないと希望するHTMLソースコードを取得できないということです。

スレイピングでよく使用されるRequestsモジュールでは、JavaScriptを実行せずにHTMLソースコードを取得するので、動的サイトではJavaScriptがHTMLを作成する前の状態しか取得できません。

もしあなたが動的なサイトをスクレイピングしたいのであれば、JavaScriptやAjaxを動作させる方法は必須の知識となります。

またブラウザの自動操作を実現するためにも、JavaScriptやAjaxを実行させることは必須です。

本記事の目的

Webサイトの読み込み時にJavaScriptやjQueryが動作する場合は、time.sleep()メソッドやSeleniumのWebDriverWaitを使った暗黙の待機を使用します。

しかしこれらの方法ではフォームにキーワードを入力し、サブミット後にWebサーバーとAjaxを使用した非同期通信を行って動的に動くサイトでは使えません。

本記事の目的としては、このようなサイトをSeleniumの特殊キー送信でAjax非同期通信を実行させることです。

特殊キーの送信

send_keys()メソッド

特殊キーの送信にはsend_keys()メソッドを使用します。
send_keys()メソッドは単にテキスト欄に文字列を送信することにも使用されます。

send_keys()メソッドの引数に特殊キーを指定することで、特殊キーの送信ができます。

特殊キーのモジュール

特殊キーはselenium.webdriver.common.keysモジュールの属性です。

特殊キーを使用する場合は以下のようにモジュールをインポートするとプログラムの記述が楽になります。

from selenium.webdriver.common.keys import Keys

import seleniumだと特殊キーを使うたびにselenium.webdriver.common.keys.Keysと記述する必要があります。
上記のようにインポートすることでKeysだけで済むようになります。

特殊キー一覧

特殊キーであるselenium.webdriver.common.keys.Keysの属性は様々あります。

以下にその属性一覧を示します。

属性 説明
Keys.ENTER Enterキー
Keys.DELETE Deleteキー
Keys.ESCAPE Escキー
KeysBACK_SPACE Backspaceキー
Keys.HOME Homeキー
Keys.END Endキー
Keys.F1~Keys.F12 F1~F12キー
Keys.TAB Tabキー
Keys.CONTROL Ctrlキー(第二引数に通常キーを指定可)
Keys.SHIFT Shiftキー(第二引数に通常キーを指定可)
Keys.UP 上矢印キー

Keys.CONTROLとKeys.Shiftは以下のように第二引数に通常キーを指定することで特殊キーと通常キーを同時に押下する動作を指定できます。

element.send_keys(Keys.CONTROL, "a")

またページをスクロールしないと新しいコンテンツを読み込みしないサイトでは、Keys.ENDやKeys.HOMEが使えます。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

options = webdriver.ChromeOptions()

options.add_experimental_option("excludeSwitches", ['enable-automation'])
driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=options)

url = "https://office54.net"
driver.get(url)

html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.END)

上記ではタグHTML要素を取得して、ページの末尾までスクロールする内容となっています。
これでスクロールしないとコンテンツをダウンロードしないサイトも恐くないですね。

SeleniumでAjaxを実行させる

そもそもJavaScriptやjQuery、Ajaxを使用したWebサイトをスクレイピングするにはSeleniumを使う必要があります。

requestsモジュールは静的なWebサイトでしか使うことはできません。

そしてWebサーバーとのAjax非同期通信を実行させるにはSeleniumの特殊キー送信を使います。

Ajax実行のために特殊キーのKeys.ENTERを私はよく使っています。

フォームに入力されたキーワードからAjax非同期通信を行う場合、まずsend_keys()メソッドでフォームにキーワードを入力します。
そしてsend_keys()メソッドでKeys.ENTERを指定しEnterキーを実行することで、Ajaxによる非同期通信を実行させます。

これにより希望するページが表示されるので、そこからHTMLソースコードを取得してBeautifulSoup4で解析を行います。

まとめ

本記事「【Python】Selenium:Ajax非同期通信を特殊キー送信で実行させる」はいかがでしたか。

JavaScriptやAjaxを実行させることができれば、ほぼすべてのWebサイトを操作できると言えます。

スクレイピングで情報収集をする場合や、ブラウザの自動操作には必須の技術となりますので、ぜひ覚えて使ってみてください。