はじめに
Hamee Advent Calendar 2015 14日目の記事です。
ブラウザ画面上からAPIが作れるらしいkimonoを触りたいと思ってました。
これでページデータ取得して、そのデータをプロットしてみます。
対象
記事を評価できる値が取れれば何でも良いので、今回はNeverまとめの各記事のビュー数を見て、ビュー数の傾向を視覚化してみます。
延々と記事のビューが増え続けることもないので、徐々にビューの増加傾向はなまっていく…はず。
カラム | 内容 |
---|---|
number | 記事インデックス(上から1,2,...) |
title | 記事タイトル |
url | 記事URL |
view_count | ビュー数 |
c_time | クロール時間 |
kimonoによるクロール設定
kimonoアカウントを作成したら、目的のページを開いてkimonoをONにしてGETしたい欲しいパラメータを選択。
選択できたらDoneするとAPIが発行されます。kimonoのクロール設定は最短の15分毎に。
この時点で、各言語で作成したAPIを叩くためのDocまで発行されます。
Rもありますが今回はPHPで。定期実行させてDBに突っ込みます。数時間待ってみる。
CrawlHistory
クロール履歴。
DB
時間経過とともに溜まりました。
ページ側の挙動に揺さぶられる部分もあります(同形式の別ページに記事が移動した場合検出しない)。約15分間隔で3日計測し、10回以上のプロットが可能な記事に対してプロットすることにしました。
データのプロット
Rを用いて、格納したデータを整理してplotしてみます。
# ライブラリ導入
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)
}
出力例が以下。
もっと踏み込みたかった部分やメモ
- kimonoはページネーションリンクがあると複数ページまで対象にできるが、今回の対象ページに設置されていなかったので張れず。ただ、対象をポチポチする段階でタグ指定、出力形式の修正も可能な様子なので、無理すれば今回でも隔ページなAPIを作れたかも
- 1APIの対象が複数ページに及ぶとオートクロールの制限がそれに比例して厳しくなってしまう。15分単位クロールできるのは今回のような単一ページ対象の場合のみ
- 徐々にビュー数が減退していくかと思ったが、クロール対象がページTOP20件のみであったため、別ページに移行した際まで継続して検出できていない。ここまで線形な傾向かは怪しい。後続ページまで検出できるともっと見えるかも…
- (恐らく)ビュー数の増加傾向は減退していくと考えられるため、モデル方程式などに当てはめて予測できると良さそう。パンデミックモデルのSIRモデルとか。
- そうでなくても回帰分析で予測することもできそう。
参考にしたもの
kimonoの使い方 基礎編
http://qiita.com/her0m31/items/b844ff74a9d488c9dc81
R言語とMysql
http://qiita.com/pollseed/items/e1abd142eb452c31e720