HameeDay 14

kimonoでページクロールしてRで傾向をグラフ化する

More than 3 years have passed since last update.


はじめに

Hamee Advent Calendar 2015 14日目の記事です。

ブラウザ画面上からAPIが作れるらしいkimonoを触りたいと思ってました。

これでページデータ取得して、そのデータをプロットしてみます。


対象

記事を評価できる値が取れれば何でも良いので、今回はNeverまとめの各記事のビュー数を見て、ビュー数の傾向を視覚化してみます。

延々と記事のビューが増え続けることもないので、徐々にビューの増加傾向はなまっていく…はず。

カラム
内容

number
記事インデックス(上から1,2,...)

title
記事タイトル

url
記事URL

view_count
ビュー数

c_time
クロール時間


kimonoによるクロール設定

kimonoアカウントを作成したら、目的のページを開いてkimonoをONにしてGETしたい欲しいパラメータを選択。

スクリーンショット 2015-12-12 14.53.57.png

選択できたらDoneするとAPIが発行されます。kimonoのクロール設定は最短の15分毎に。

スクリーンショット 2015-12-12 15.01.44.png

この時点で、各言語で作成したAPIを叩くためのDocまで発行されます。

Rもありますが今回はPHPで。定期実行させてDBに突っ込みます。数時間待ってみる。


CrawlHistory

スクリーンショット 2015-12-12 13.49.30.png

クロール履歴。


DB

スクリーンショット 2015-12-12 13.30.36.png

時間経過とともに溜まりました。

ページ側の挙動に揺さぶられる部分もあります(同形式の別ページに記事が移動した場合検出しない)。約15分間隔で3日計測し、10回以上のプロットが可能な記事に対してプロットすることにしました。


データのプロット

Rを用いて、格納したデータを整理してplotしてみます。


data_plot.r

# ライブラリ導入

library("DBI")
library("RMySQL")

db_connect = dbConnect(dbDriver("MySQL"), host="host", dbname="dbname", user="user", password="password")

# レコードの取得
query = "SELECT * FROM never_pickup GROUP BY url ORDER BY c_time;"
result = dbGetQuery(db_connect, query)
# 取得が10回以上の記事URLを獲得
query = "SELECT url FROM (SELECT * FROM never_pickup GROUP BY url) pick GROUP BY pick.url HAVING COUNT(url) >= 10 ORDER BY COUNT(url);"
url_list = as.matrix(dbGetQuery(db_connect, query))
news_count = length(url_list)

# 3*3 9件単位でグラフ化
par(mfrow=c(3,3))
for (i in url_list) {
one_result = subset(result, url==i)

# 要素の整頓
c_date = as.matrix(one_result$c_time)
c_time = as.POSIXlt(c_date)
view_count = as.matrix(one_result$view_count)

# プロット
plot(c_time, view_count)
}


出力例が以下。

スクリーンショット 2015-12-12 20.56.52.png


もっと踏み込みたかった部分やメモ


  • kimonoはページネーションリンクがあると複数ページまで対象にできるが、今回の対象ページに設置されていなかったので張れず。ただ、対象をポチポチする段階でタグ指定、出力形式の修正も可能な様子なので、無理すれば今回でも隔ページなAPIを作れたかも

  • 1APIの対象が複数ページに及ぶとオートクロールの制限がそれに比例して厳しくなってしまう。15分単位クロールできるのは今回のような単一ページ対象の場合のみ

  • 徐々にビュー数が減退していくかと思ったが、クロール対象がページTOP20件のみであったため、別ページに移行した際まで継続して検出できていない。ここまで線形な傾向かは怪しい。後続ページまで検出できるともっと見えるかも…

  • (恐らく)ビュー数の増加傾向は減退していくと考えられるため、モデル方程式などに当てはめて予測できると良さそう。パンデミックモデルのSIRモデルとか。

  • そうでなくても回帰分析で予測することもできそう。


参考にしたもの

kimonoの使い方 基礎編

http://qiita.com/her0m31/items/b844ff74a9d488c9dc81

R言語とMysql

http://qiita.com/pollseed/items/e1abd142eb452c31e720