Seleniumではてなブログのアクセス数を取得する

ブログがどれくらい読まれているかは、はてなブログの場合はアクセス解析ページを見ることで、確認できます。このアクセス解析ページでは、日ごとのアクセス数などがグラフ化されているので、何か分析ツールを用意しなくてもある程度の視覚化は済んでいます。

しかし、より複雑な分析をしたいという人もいるでしょう。その場合は、アクセス解析ページに載っているデータを収集して、アクセス情報のデータセットを用意する必要があります。


ここで、TwitterアナリティクスのようにCSVデータが用意されているなら簡単なのですが、残念ながらCSVデータが提供されていないアナリティクスの方が多数派のようです。はてなブログアクセス解析ページでもそのようなデータセットは用意されていませんでした。


それでは、毎日アクセス解析ページを確認して、必要なデータをコピペしていかなければならないのでしょうか。それを毎日やるのはとても大変な作業です。手作業でのデータ収集では、うっかり間違ったデータを取ってきてしまうこともあり得ます。

そこで、Seleniumを使ってデータ収集の自動化を図りますSeleniumWebサービス画面の自動テストツールですが、はてなブログアクセス解析データを取得するという、スクレイピングのような使い方もできます。本記事では、Seleniumの使い方を紹介して、実際にアクセス情報を取得してみます。


この記事でやること


はてなブログアクセス解析ページから、何かしらのデータを入手します。自動的にデータを取得するために、人力操作を自動化させることができる「Selenium」を使用します。

行うことは、以下の通りです。


  1. chromedriver.exeを入手する
  2. PythonSeleniumを実行するスクリプトを作成する
  3. スクリプトを実行する


なお、今回はGoogle Colabではなく、Windows版の Pythonをインストールして、そこでスクリプトの実行を行いました。インストールの方法を解説している動画などがありますので、まだPythonを使ったことが無い人はそれらを参考にしてインストールしてみてください。


youtu.be


chromedriverのダウンロード


Seleniumによるブラウザのリモートコントロールは正規の使用方法ではないため、これを実現するにはブラウザごとにリモートコントロールを制御するためのドライバが必要となります

今回はChromeを使って目的のページにアクセスするので、chromedriverを入手します。ダウンロードの方法はこちらの記事などを参考にしてください。


ダウンロードしたexeファイルは、デスクトップなどに置いておきます。


これで必要なものが全て揃ったので、Seleniumの設定を行います。

まずはSeleniumをインポートします。


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


Seleniumのオプションを設定し、先ほど入手したchromedriverを読み込みます。


driver_path = "./chromedriver_win32/chromedriver.exe"
driver = webdriver.Chrome(webdriver_path)


これで、Seleniumを使うための事前準備が完了しました。


ログイン操作の記述


はてなブログアクセス解析ページに入るためには、最初にログインしなければなりません。こちらの記事を参考にして、Seleniumでログインを実行しました。

まずは、ログインページに移動します。


driver.get("http://www.hatena.ne.jp")
elem = driver.find_element_by_link_text("ログイン")
elem.send_keys(Keys.RETURN)
time.sleep(3)  # ロードを待つ

このスクリプトでは、「ログイン」と書かれているリンクをページ内から探して、そのリンクに対してRETURNキーを押下しています。サイトのデザインが変わっていなければ、無事にログインページまで移動できるはずです。

次に、入力フォームに情報を記述し、ログインを試みます。

username = "******"
password = "******"

# 情報の入力
elem = driver.find_element_by_name("name")
elem.send_keys(username)
elem = driver.find_element_by_name("password")
elem.send_keys(password)

# 「次回から自動的にログイン」のチェックを外す
elem = driver.find_element_by_class_name("checkbox-text")
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, 5, 5)
action.click()
action.perform()

# 「ログイン」をクリックする
elem = driver.find_element_by_class_name("submit-button")
elem.send_keys(Keys.RETURN)
time.sleep(3)


これでログインが完了しました。この状態からなら、自身のアクセス解析ページに入ることができるはずです。


アクセス解析ページからデータを取得する


それでは、アクセス解析ページからデータを取得するスクリプトを作成します。取得するデータは何でも良いですが、今回は「アクセス元サイト」第1位の比率を取得してローカルのファイルに格納します。


import datetime

analytics_url = "******"
my_xpath = "******"
outfile = "./accesslog.txt"

driver.get(analytics_url)
elem = driver.find_element_by_xpath(my_xpath)
print(elem.text)


取得したいデータの場所は、HTMLソースを見て指定する必要があります。指定する方法は、HTML属性のnameやclassやidなどを検索するのが良いですが、もし面倒ならxpathを指定することもできます。

目的の場所にカーソルを合わせてctrl+shift+cを入力し、ハイライトされたhtmlタグを右クリックして「Copy」→「Copy XPath」をクリックするとxpathをコピーできます。


f:id:emoriiin979:20210108161938p:plain


あとは、find_element_by_xpathにコピーしたxpathを指定すると、該当箇所のテキスト要素を取得できます。

これで、残りはスクリプトを実行するのみですが、このまま実行すると無視しても問題ない警告ログが出現したり、Chromeが突然表示されて邪魔になったりするので、あらかじめオプションを指定しておくことでこれらを非表示にします。


options = webdriver.ChromeOptions()

# 警告ログを非表示にする
options.add_experimental_option("excludeSwitches", ["enable-logging"])

# headlessモードにしてChromeを開かないようにする
options.add_argument("--headless")

driver = webdriver.Chrome(driver_path, options=options)


動作確認


最後に、正しく動作しているか確認するために、作成したスクリプトを実行してみます。


# test.py

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

username = "******"
password = "******"
driver_path = "./chromedriver_win32/chromedriver.exe"
analytics_url = "******"
my_xpath = "******"
outfile = "./accesslog.txt"

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
options.add_argument("--headless")
driver = webdriver.Chrome(driver_path, options=options)
driver.get("http://www.hatena.ne.jp")

elem = driver.find_element_by_link_text("ログイン")
elem.send_keys(Keys.RETURN)
time.sleep(3)

elem = driver.find_element_by_name("name")
elem.send_keys(username)
elem = driver.find_element_by_name("password")
elem.send_keys(password)

elem = driver.find_element_by_class_name("checkbox-text")
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, 5, 5)
action.click()
action.perform()

elem = driver.find_element_by_class_name("submit-button")
elem.send_keys(Keys.RETURN)
time.sleep(3)

driver.get(analytics_url)
elem = driver.find_element_by_xpath(my_xpath)

with open(outfile, "a") as f:
    txt = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    txt += "\t" + elem.text
    print(txt, file=f)

time.sleep(5)
driver.quit()


作成したスクリプトは上記の通りで、コマンドプロンプトやターミナルなどから下記のコマンドで実行できます。


> python test.py


すると、ローカルのテキストファイルの中に、スクリプトを実行した瞬間のデータが格納されていることが確認できます。


f:id:emoriiin979:20210108163314p:plain


これで、アナリティクスのデータを自動的に取得するスクリプトが完成したので、あとはジョブスケジューラーを使うなどして定期的にスクリプトを実行するようにすれば、データが簡単に入手できるようになるでしょう。


まとめ


今回の記事では、SeleniumPythonを使ってはてなブログアクセス解析データを取得する方法について紹介しました。


この方法なら簡単にWeb上のデータを取得できますが、いくつか注意点があります。

まず、サイトのデザインが変更されたときは、要素の探し方を変更する必要があることです。Seleniumではclass名などで要素の場所を検索するので、当然ながらclassが変更されたら今までのスクリプトは正しく動作しなくなります。

また、Seleniumのように機械的にページをスクレイピングすることを禁止しているサービスも存在します。このような情報は規約等に記載されていることが多いらしいので、事前に確認しておくのが良いと思います。


上記のような問題もありますが、Seleniumを使えばWeb画面上の操作を自動化できる旨みがあるので、画面の自動テストや本記事のようなスクレイピングなどでとても良い活躍をしてくれると思います。ぜひご活用ください。


以上です。