好き嫌い.comのログ取得
注意
※下記記載の方法はできなくなりました。
2023/2頃までは取得できましたが2023/3頃には取得不能な事を確認しています。
ということで有料記事から無料記事にしています。
概要
好き嫌い.com(https://suki-kira.com)ってのがあります。
好き嫌い.comは今話題の芸能人・有名人のみんなの好き嫌いを共有するサイトです。以下のような楽しみ方の他にも自分だけの楽しみ方を見つけてください!
・普段なかなか共感の得られないあの芸能人の同志と語り合える!
・あの芸能人の真実の好感度がわかる!
・あのアイドルグループ内の好感度ランキングは?!
ということで、
好き嫌いの投票とコメントが書けてあーだーこーだー言いあうサイト
なんですが、そこそこ匿名性があるようで2ch(5ch)のノリでどんどんコメントが書かれています。
ブラウザ上だと20件ずつしかコメントが見れなくて、
1万コメントを超えてくると最新コメント以外を追うのが辛い。
ってなわけで、コメントを取得する方法です。
主にスクリプト等を組んで取得する事を前提の方法です。
アイデア料として有料記事にしています。
本当はここから有料記事でした。
取得アプローチ
まず最初に考えたこと
・htmlを取得して適当に文字を切り出す。
例えば、https://suki-kira.com/people/result/富澤たけし を取得すると
最新の20件のコメントがhtml内にあります。
同様に https://suki-kira.com/people/result/富澤たけし/2 を取得すると
21件目~40件のコメントがhtml内に出てきます。
あとはひたすらループしてコメントを切り出していくだけ。
ただこれだとコメントの速度が速いと別のページでも同じコメントがダブりで取得できたり効率は良くなく、htmlの切り出しは面倒。
htmlタグを見ているとある事に気づきます。
・コメントデータを取得する
コメントを切り出そうとhtmlタグを見ていたら
<div itemprop="review" itemscope itemtype="http://schema.org/Review" id="/people/vote/get_comment_by_index/?pid=1103&index=9034">
こんな行がありました。この中にあるこれ
/people/vote/get_comment_by_index/?pid=1103&index=9034
URLっぽいので、
https://suki-kira.com/people/vote/get_comment_by_index/?pid=1103&index=9034 ここにアクセスしてみると
{
"body": "やっぱ凄いなコイツら<br />\r\n嫌い派にも芯食ったコメントがほとんどない",
"index": "9034",
"created_at": "2022-11-06 02:18:17",
"type": "1",
"name_hash": ""
}
こんな感じでjsonでコメントが取れる事がわかりました。
コメントに対する投票は取れないけど、コメントと番号等が取れます。
index9034はコメント番号で、pid1103は富澤たけしのIDってことが推測できます。
取得
ここまでわかれば後は簡単です。
コメントを1から全部取得したい場合はindex1から取得していくだけです。
コメント以上のindexを指定した場合「このコメントは削除されました」が取得できるので、そこでストップするという具合。
プログラムで動かす場合、アクセス過多にならないように
いい塩梅でスリープを入れておくとよいでしょう。
以下PHPで取得する場合の簡単サンプル例です。
$url = "https://suki-kira.com/people/vote/get_comment_by_index/?pid=1103&index=";
$check_count = 0;
$k = 1; //スタート位置
$num = 10000; //取得数
for($i = $k; $i <= $k + $num; $i++)
{
$json = file_get_contents($url . $i);
$temp = json_decode($json);
if(!isset($temp->created_at))
{
//削除されたコメント
$check_count++;
if($check_count >= 10)
{
//強制終了
exit;
}
}
else
{
//削除されていない正常なコメント
$check_count = 0;
//CSVに書き込む等の処理をする
//######################
}
if($i % 100 == 0)
{
sleep(1);
}
}
という感じで、単純なforループでデータを取得し、
created_atの要素があるかないかでコメントが有効なコメントかどうかを判定します。
コメントが存在しないデータが10件ほど続いた時にループを終了します。
適度に100件毎に1秒ほどスリープを入れています。
取得後の活用方法
コメントを取得するとhtmlタグのままのコメントが取得できてしまいます。
コメントに対する返信はspanのアンカータグがあったり、
そのままhtmlでビューワーを作るのであれば少しの加工でいい感じに作れそうですが、
それ以外の方法でビューワーを作る場合はそれなりに加工が必要そうです。
個人的にはCSVで書き出してそれをそのままgoogleのスプレットにインポートして見るだけに留めていますが、
元サイトの構成を拝借してコメントビューワーを作るのも1つかな?って感じ。