こんにちは。阿形です。
PythonでWebスクレイピングの第3回です。
前回ブラウザをPythonから起動することができましたので、今回はブラウザをPythonから制御してみようと思います。
今回からは、ブラウザを制御し実際のWebサイトにアクセスしていきますが、ここで問題になるのが各サイトの利用規約です。
自動アクセスやスクレイピングについては、明示的に利用規約で禁止しているところが増えていますので、利用規約をきちんと確認されることをおすすめします。
例えば、TwitterはAPI以外での自動アクセスを禁止しています。
してはならないこと
…
Twitterのウェブサイトを操作するスクリプトを作成するなど、API以外の方法で自動化する。このような方法で自動化した場合、アカウントが一時的にロックされるか、永久凍結されることがあります。
Twitter 自動化ルール : https://help.twitter.com/ja/rules-and-policies/twitter-automation
学習用には、自身の管理するサイトやテスト用のサイトを作って行うようにしてください。
ここでは本ブログサイトを例に取り上げて進めていきます。本ブログサイトを使用してテストを行っていただくのはかまいませんが、なにぶん非力なサーバーで運用しているので、大量アクセスして弊社サイトに負荷かけるのは勘弁してくださいね。
では早速本ブログサイトをPythonで制御しているブラウザで開いてみましょう。
動作確認なので、前回までと同様に、まずはPythonの対話モードでやってみます。まずは前回やったようにブラウザを起動します。
$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import Options
>>> import chromedriver_binary
>>> options = Options()
>>> options.binary_location = '/usr/bin/chromium-browser'
>>> driver = webdriver.Chrome(options=options)
前回までの設定ができていれば、chromiumブラウザが開いているはずです。
続けて以下のように入力すると、指定したURLを開くことができます。
driver.get('https://blog.interstellar.co.jp/')
さて、ページを開くことはできましたが、これだけではあらかじめわかっているURLを開くことしかできません。
リンクを見つけて自動的に移動することができないと、とても自動化はできませんが、プログラムにどこをクリックしたらいいか、指定する必要があります。
Seleniumでは、以下のようなものを元に要素を取得することができます。
詳しくはSeleniumのドキュメントに記載されていますので、そちらも参照してください。
ここではページの右側にあるカテゴリーの「AWS」のリンクを探し、クリックしてみます。
link_element = driver.find_element_by_link_text('AWS')
find_element_by_link_textというのが、リンクテキストを元に要素を選択する部分になっています。
見つかった要素インスタンスをlink_elementに格納しています。
なお、find_element_…だと、最初に見つかった要素一つだけを返します。
ここでは使用していませんが、find_elements_…と複数形にすると、条件に適合するすべての要素をリストで返してくれますので、例えば記事のリストをループで回して処理したい場合などに便利なので、覚えておくと良いと思います。
要素が特定できたので、これをクリックしてみましょう。
こちらは非常に簡単です。
link_element.click()
これでリンクをクリックし、AWSのカテゴリーの記事リストが表示されたはずです。
今度はページの一番上にある検索ボックスに文字を入力してみましょう。
まずはテキストボックスの要素を取得します。
HTMLソースを見てみたところ、クラス名で指定するのが良さそうなので、find_element_by_class_nameでクラス名を指定してみます。
input_element = driver.find_element_by_class_name('searchBox__input')
要素をinput_elementに格納したので、今度は文字を入力してみます。文字入力はsend_keys()を使用します。
input_element.send_keys('Python\n')
Pythonと改行を入力してみました。
この検索ボックスでは、改行を入力するとそのまま値がサブミットされて検索されるので、検索ボタンを押さなくてもこれだけで検索が可能です。
ただ、間違いなく処理を行うなら改行ではなく、ボタンを押すようにしたほうがいいかもしれません。
ここまででなんとなくわかってきたかと思いますが、Seleniumでのブラウザの操作は
というステップで処理を行います。
割と面倒なのが、「要素を探す」部分で、HTMLの構成次第で思った要素をなかなか指定できないこともあります。このあたりはひたすら試行錯誤なので、時間のかかる部分でもあります。
本ブログでは最初はPythonの対話モードで、と書いてきましたが、まさにこの要素を取得する試行錯誤の部分があるのが理由です。
Seleniumに慣れるまでは、まず対話モードでいろいろ使い倒してみましょう!
今回はここまでです。
次回はソースを取得して解析してみようと思います。