【DIY】初めてのPython&WEBスクレイピング
こんばんは。
自分の想いを発信してみようと思って始めたnoteだが、
やはりダッシュボードを覗いたときに、
一人でも見てくださる方が増えているのを確認できると、
見ていただけているという実感がわき、すごく楽しいと思う。
ビュー数を増やすことが目的ではないが、
結果的にどんなふうに増えたかな?って気になり、
ダッシュボードの画面をキャプチャして、
履歴を追えるようにしていた。
刺激された記事
そんな時、この記事を見つけ、すごいな~と思った。
とても勉強になるし、面白そう。
会社でも使う人は使っていたりするので、
Pythonというプログラミング言語の名前だけは知っていた。
前に上司が
「パイソン?なんか強そうな名前だね」
とか言っていた記憶くらいしかない。
なにかと話題にでることもあり、DIYの一環で、
この際少し勉強してみようと思いたった。
とりあえずやってみた
記事に刺激され、
PythonでのWebスクレイピングに挑戦してみた。
スクレイピングが何かわからなかったが、調べてみると、
WEB上の情報を取得/抽出して解析などを行うことのようだ。
本当は1日単位で集計できるといいのだが、
ダッシュボードでの表示は週単位が最小単位なので、
一週間ごとにダッシュボードの履歴を遡り、
ビュー数の推移をcsvに自動出力するようにしてみた。
noteは始めたばかりなので週数が少ないが、
こんな感じでcsv出力できた。↓
これだけ?・・
と思うかもしれない。(笑)
作ったコードはこんな感じ
素人が独学でざっと作ったものなので、
ほとんど参考にならないと思うが、今回作ったコードを載せてみる。
XXXXとなっているところは、
個人環境特有の情報やパスが入るところなので、
ここを変えればと使えると思う。(使う人いないかな笑)
from selenium import webdriver
from time import sleep
import csv
import datetime
#webdriverの設定
driver = webdriver.Chrome('XXXX/chromedriver')
#noteのトップページを開く
target_url = 'https://note.com/'
driver.get(target_url)
sleep(1)
#ログインボタンを押す
try:
login_button = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/header/div[1]/nav/div[2]/a/div')
sleep(1)
login_button.click()
sleep(1)
except Exception:
error_flg = True
print('ログインボタン押下時にエラーが発生しました。')
#IDとパスワードを入力し、ログインボタンを押す。
USERNAME = 'XXXXX'
PASSWORD = 'XXXXX'
try:
#ユーザ名を入力
username_input = driver.find_element_by_xpath('//*[@id="email"]')
username_input.send_keys(USERNAME)
sleep(1)
#パスワードを入力
password_input = driver.find_element_by_xpath('//*[@id="password"]')
password_input.send_keys(PASSWORD)
username_input.submit()
sleep(1)
except Exception:
print('ユーザー名、パスワード入力時にエラーが発生しました。')
#ログインボタンを押す
notnow_button = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/main/div/div[2]/div[5]/button/div')
sleep(1)
notnow_button.click()
sleep(1)
#ダッシュボード画面に遷移する
dash1_button = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/header/div[1]/nav/div[3]/div/div/div/button')
sleep(1)
dash1_button.click()
sleep(1)
dash2_button = driver.find_element_by_xpath('//*[@id="popover-menu-96"]/div/ul/li[9]/a')
sleep(1)
dash2_button.click()
sleep(1)
dash3_button = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[1]/div[1]/ul/li[1]/button')
sleep(1)
dash3_button.click()
sleep(3)
#ダッシュボードの情報を週単位で遡って取得
list_date_start=[]
list_date_end=[]
list_pv=[]
list_comment=[]
list_suki=[]
i = 0
end_flag = 'False'
while end_flag == 'False':
#対象期間を取得
date_start = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[1]/div[2]/div/div[2]/time[1]')
date_end = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[1]/div[2]/div/div[2]/time[2]')
#全体ビュー数を取得
pv = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[3]/div[1]/div[2]')
#コメント数を取得
comment = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[3]/div[2]/div[2]')
#スキの数を取得
suki = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[3]/div[3]/div[2]')
#取得情報を配列に格納
list_date_start.append(date_start.text)
list_date_end.append(date_end.text)
list_pv.append(pv.text)
list_comment.append(comment.text)
list_suki.append(suki.text)
#前の週を表示する
prev_button = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[1]/div[2]/div/div[1]/button')
sleep(1)
prev_button.click()
sleep(1)
date_start = driver.find_element_by_xpath('//*[@id="__layout"]/div/div[1]/div[2]/div/main/div/div[3]/div/div[1]/div[2]/div/div[2]/time[1]')
if date_start.text == '2021年8月7日' :
end_flag = 'True'
i_max = i
else :
i += 1
#取得した全体プレビュー数/コメント数/スキの数をcsvファイルに出力
csv_date = datetime.datetime.today().strftime("%Y%m%d")
csv_file_name = 'note_dashboard' + csv_date + '.csv'
f = open('XXXXX'+ csv_file_name, 'w', encoding='cp932')
writer = csv.writer(f, lineterminator='\n')
csv_header = ["開始日","終了日","全体プレビュー","コメント","スキ"]
writer.writerow(csv_header)
i = i_max
end_flag = 'False'
while end_flag == 'False' :
csvlist = []
csvlist.append(list_date_start[i])
csvlist.append(list_date_end[i])
csvlist.append(list_pv[i])
csvlist.append(list_comment[i])
csvlist.append(list_suki[i])
writer.writerow(csvlist)
i -= 1
if i < 0:
end_flag = 'True'
f.close
本当に勉強のためだけに、
とりあえず動くものを作ってみたが、
やはりプログラミングって面白いと思った。
やったことをメモしておこうと思う
①「Python WEBスクレイピング」で検索し、以下のサイトを読んでみた。
ふんふん、PythonのRequestsというライブラリで
WEBページの情報を取得し、取得した情報の中から
Beautiful Soupというライブラリで必要な情報を抽出するのか。
動的なWEBページだとSeleniumというライブラリを使うと
取得と抽出もできるらしい。
・・・ん?全然わからない。。
なんとなく当てはめてみると、
WEBページ(noteのダッシュボード)から
必要な情報(アクセス情報)を抽出することができる、
便利な方法なんだろう。
とりあえずこのサイトにあるとおり、
サンプルコードを動かしてみよう!
②まずはPython環境をインストール
とりあえずダウンロードしてインストールしてみた。
③エディタのインストール
ネットで「Python エディタ」とかで検索してみた。
過去にHTMLやCSSをやってみよう!と思い立ち、
すこーしだけ触ったことのある、
Visual Studio Codeを改めてインストールした。
動作も比較的軽快という評価もあったし。
日本語化もネットで調べてやっといた。
④とにかくサンプルコードをコピペして動かしてみた。
Visual Studio CodeでPythonのコードを実行する方法は?
ってのがそもそもわからなかったので、それもネットで調べてみた。
ウィンドウ右上の三角矢印をおすといけた。
もちろん、最初は「Hello World」と表示するだけ。
ちなみにPythonコードはxxxx.pyという拡張子らしい。
⑤ダッシュボードにログインしてみよう
サンプルコードで、
一通りPythonでのスクレイピングに関する
各ライブラリを見よう見まねで使ってみた後、
まずはnoteのページに入るところからやってみようと思った。
noteのページはログインするところから始まるので、
Seleniumライブラリで実施するのだろうと思い、
コーディングにとりかかった。
参考にしたサイトでは、Seleniumを使ったサンプルとして
インスタグラムにログインするやり方があったので、
同じことだと思ったのだ。
ということで、サンプルをつぎはぎつぎはぎ、
url情報とかを書き換え、まずはnoteの
ログイン画面からダッシュボード画面まで
プログラムコードの指示により辿り着くように頑張って考えてみた。
一番苦労したのは、人がやるときは単に
そこにある「ログイン」ボタンを押せばいいのに、
パイソンに押させようとするとどうしていいかわからない。
ボタンの識別情報を拾う必要があるのだが、
どうやってそこにあるものを特定すればいいのか・・・
色々調べてみると、WEBページ上の特定の箇所を
指定するための方法として、XPathという仕組みがあることが分かった。
さらにGoogle Chromeの検証機能にあるCopy XPath
(ソースコード中の指定個所をXPathとしてコピーできる)
を使って、知りたい箇所のXPathを簡単に取得できることを知った。
これを知らなければ、恐らくcsv出力はまだできていなかったと思う・・。
ダッシュボードまでいければ、やはりXPathの指定を駆使して、
画面を週単位で過去に遡ったり、その都度アクセス情報を拾ったり。
拾った情報をどう変数に格納し、どうcsvに出力するのか、
繰り返しの構文は、なども適宜調べながらコーディングしていった。
csv出力までやってみて思った事
とりあえず動くものを作ってみて、以下の点が不便だなぁと思った。
・実行させたときの動作が、本当に人がマウスやキーボードで入力しているかのように画面遷移していくので、遅い。
・画面遷移を伴うのでsleepで次の動作まで一呼吸おいている箇所があるが、ネット回線の状況によってはsleepで待つ秒数が足りなかったりすることがあり、動作が不安定。
・作るだけでなく、使うだけでも、Python環境のインストールが必要なのが面倒ではないか。
もっと調べてみると、他にも何かうまいやり方があるかもしれない。
あと、冒頭で(勝手に)紹介にさせていただいた記事を
改めて読み返してみて、PythonのPandasというライブラリに
触れられているが、私も色々調べている中でこの言葉をしばしば目にした。
WEB上の表データを簡単に取得できるライブラリらしいのだが、
まだうまく使いこなせていない。
この辺ももう少し深堀したりしてみたいなと思う。