FEHの投票大戦からデータ取ってきてみた(Python)(スクレイピング)

事のはじめ

CTFで調べてみるとやっぱりPythonが有能
Python書くの練習すっぺ。スクレイピングでもやるか。
→ちょうどFEHの投票大戦が開催している
→いっちょやってみっか!(悟空)

とりあえず書いてみた

github.com

で、とりあえず書いてみました。
Twitterに投稿するまでを1セットという感じです。

最初に調べたこと

robots.txtを見てみる

スクレイピングする上ではやっぱり注意しないといけないのが「スクレイピング禁止」かどうかでしょうか
FEH投票大戦スコアページのrobots.txtをとりあえず見てきました。

f:id:sorenuts:20180601235734p:plain

よし(適当)多分大丈夫でしょう。

Pythonでのスクレイピング方法

ライブラリは前にBeautifulSoupというものがあるのを見たので、これについて使い方を調べてみました。

Python3 + urllib + BeautifulSoupでネット上の情報を取得する

HTMLのタグをもとに掘り下げていけば目的の部分を取り出せるようです。

スクレイピング対象の観察

今度はFEH投票大戦スコアページのソースを見に行きました。

f:id:sorenuts:20180602000619p:plain

ご存知、Chromeデベロッパーツール(うちはSRWareIronですが)でソースを見てみると、「n回戦」がarticleタグ単位で、「キャラVSキャラ」がliタグ単位で、「キャラ名とスコア」がpタグで表示されているとわかりました。
また、過去の大戦結果のページを見てみると、最新の対戦カードは上から二番目のarticleタグにくることがわかりました。
また、クラス名は'body-section-tournament'であることもわかりました。
articleタグのクラス名'body-section-tournament'に絞ってスクレイピングしてみると、一番上のarticleタグ、クラス名'body-section-tournament current'まで拾ってきてしまいました。調べてみた感じだと、どうやら同じ文字列が入ってることだけが原因みたいでした。

mankuro.hateblo.jp

仕方ないので常に上から二番目のarticle要素より、データを引っ張ってくることにしました。

実際にスクレイピング

articleタグ内のliタグ内のpタグの要素を引っ張ってきて出力してみると、取り出したかったデータが確認できました。

Twitterに投稿する

ついでなのでTwitterに取得したデータをPythonから投稿してみました。

Twitterへの投稿方法

いつも通りTwitter APIを使えるようにしました(書くの面倒)

pip install twitter

したら、あとはTwitter用のライブラリを導入して、キーやらなんやらを設定して投稿!だけなのですが、このままだと生のコンシューマキーとシークレットを晒すことになって危険です。
そこで、以前Rubyで作成したupdate_name*1でも環境変数をファイルに書いて外部に見えないようにしたのを思い出しました。Pythonでも同じことができると思い、環境変数からキーを読み込む方法を調べてみました。

【GitHub】に載せたくない環境変数の書き方 Python

こちらを参考に、.envにキーを書いて、コードをコピペして終わり!(書くの飽きてきた)

今後

とりあえず今の投票大戦期間で自動的に大戦経過をツイートできないかと考えている感じ。herokuだと止まっている時間が長いので、Red Hat Open Shiftに目をつけ始めている。
あとは劣勢時に通知が飛ばせればなぁとかそんな感じ。過去の傾向から予測して劣勢の予測とかもしてみたいなぁ(以前某所で見たことがあるけども)

*1:Twitterで特定の語尾のつぶやきを拾ってきて、自分のスクリーンネームにするお遊び