ランキングで異常値発生

Pagespeed APIでスクリーンショットを取得の記事でも、クリックランキングでディレクトリ型検索エンジンdtnだけ異常値がでていることをご紹介しました。

今日また見ても異常値がでておりましたので、しっかり調べてみることにしました。

同じ集計期間でdtnディレクトリだけ800弱に!?

ログデータの確認

クリックランキングのデータ取得時には、リファラ、ホスト名なども一緒に保存していたのですが、リファラがNULLの大量データが連続して入っている時間があることに気が付きました。多分これが異常値となる原因のようです。

リファラがNULLのデータが連続

クリックカウント処理を再確認

ログに不正なデータがINSERTされるということは、数年前頃に見直しをしていたクリックカウント処理が原因となっているようですので、プログラムを再度見直してみました。

改修前の登録サイトのリンクカウント方式

以前の登録リンクのクリックカウントは、登録されたサイトIDをパラメータとして付けたURLをリンクとして、カウント用PHPでリンクIDをGETで読み込みカウントしておりました。dtnのカテゴリのリンクは、アフェリエイトのリンクのような「?」と「&」でパラメータを渡すリンク形式となっていました。

<a href="https://www.dtn.jp/search/rank.php?MODE=OUT&LINK_ID=98&LINK_URL=https://www.dtn.jp/">ディレクトリ型検索エンジンdtn</a>

経由するrank.php側では、取得したリンクIDのカウントを取った後で、header()を使って登録リンクに301リダイレクトをかけて飛ばしており、PHP側の値取得やリンク先への転送も特に問題はありませんでしたが、登録サイトへのリンクは上記のようなURLとなるため、被リンクの形式としても印象が悪いので、ディレクトリをリニューアルしたタイミングで新方式に変えておりました。

改修後のjQueryを使ったリンクカウント方式

見直し後の形式は、<a>タグでは登録サイトへの直リンクを貼りつつ、jQueryでカウントアップを別途取得するという仕様にしています。覚えている方はもう少ないと思いますが、かつて存在したYahoo!のディレクトリでも利用されていたリンク方式です。

<a href="https://www.dtn.jp/" class="click-count" id="98" d_code="98">ディレクトリ型検索エンジンdtn</a>

ランクアップ用PHPのバグ

フロント側HTMLはこの形に変えていたのですが、jQueryで取得したIDを受け取り、裏のDBにINSERTをかけるPHPはそのまま流用してしまい、しかも、jQueryからしかデータがこないだろうと安易に考え、DB更新前に入れていたチェックもごっそり省いてしまっておりました。

そんなところに、botがGETアクセスを定期的に投げてきていたようで、それをそのままカウントアップしていたようです。

ということで、このあたりの不具合を再度修正して、無事dtnディレクトリのランキングは正常化することができました。

無事ディレクトリdtnが常に出てこなくなりました

botのアクセス

ところで、先ほどのログに残っていた、リファラが取れなかったり、ホスト名が取れなかった大量のbotアクセスですが、クリックカウントに反映されていることからGETのデータを持たせてあるようですが、何故かそのサイトはID=98(ディレクトリ型検索エンジンdtn)を持ってアクセスしてきていたようです。

MJ12bot

SEO解析系のクローラーがこのパターンだったようですが、中でも突出して多かったものがMJ12botというホスト名を持つクローラーでした。名前が印象深いbotで、昔からお行儀悪い印象がある気がしますが、こんな過疎サイトまで収集にやたら訪れるというのも凄い話です。MJ12の名前を使ったウイルスbotもあるらしいので、全部が全部本物というわけでもなさそうですが。

ちなみに、MJ12のサイトを見ると、クローラーが集めたデータをSite Explorer(有料)というもので見れるようですが、無料お試しができるというので見てみると、被リンクの増減を過去/現在で見れるとかでした。どれだけ世界中のリンクデータを収集して回っているのやらとは思ってしまいます。

有料の会員プランに加入していないと見れないものばかり

おわりに:MJ12の語源

MJ12は、あのMajestic12(マジェスティック12)から付けてるのでしょうが、お陰で昔TVでやっていた矢追純一のUFOスペシャルを久々に思い出してしまいました。心霊番組以上に怖かった記憶があります。

ランキング集計をするSQLのINTERVALは一週間程度ですので、異常値分はそのうち消えると思います。最新のクリックランキングはこちらで確認できます。