"""LOG451: pixelstomotors.com の自前の計測(ev-stats・cr-stats・hk-stats)から、 AI に読まれる量が人の来訪に変わるまでの段階を並べる集計。 入力は同じフォルダの JSON(2026-11-05 19:32〜19:33 JST に取得)。週は日本時間の月曜はじまり。""" import json def load(name): with open(name, encoding="utf-8") as f: return json.load(f) ev_all = load("ev-a1102.json") # 11/2 の週・人と機械の全部 ev_h = load("ev-h1102.json") # 11/2 の週・人だけ ev_h29 = load("ev-h1029.json") # 10/29 から・人だけ(改善 No.01 の確かめ) cr_all = load("cr.json") # 10/25 からのクローラー cr = load("cr1102.json") # 11/2 からのクローラー hk = load("hk-nb.json") # ハコブくん(機械の印なし) DAYS_NOW = 3 + 19.53 / 24 # 11/2 0:00 から 11/5 19:32 まで DAYS_PREV = 7 # 10/26〜11/1 print("== 1. 表示(ev-stats・週ごと) ==") for w in ev_all["byWeek"][:2]: d = DAYS_NOW if w["week"] == "2026-11-02" else DAYS_PREV print(f'{w["label"]}: 全体 {w["views"]} / 人 {w["humanViews"]} / 機械 {w["botViews"]} / 不明 {w["unknownViews"]}' f' / 人の1日あたり {w["humanViews"]/d:.1f}') for w in ev_h["byWeek"][:2]: print(f' 人だけ {w["week"]}: 中央値 {w["medianSeconds"]}秒 / 75%以上読んだ {w["read75Pct"]}% / スマホ {w["spPct"]}%' f' / リンクなしを押した {w["deadClicks"]} / メッセージの表示 {w["messageViews"]} / 入力開始 {w["formStarts"]}') print("\n== 2. クローラー(cr-stats・週ごと) ==") for w in cr_all["byWeek"]: d = DAYS_NOW if w["week"] == "2026-11-02" else (DAYS_PREV if w["week"] == "2026-10-26" else 1) print(f'{w["week"]}: {w["total"]} 回 / 1日あたり {w["total"]/d:.0f}') print("11/2 の週の内訳:") for b in cr["byBot"]: print(f' {b["bot"]}({b["who"]}): {b["visits"]} 回 / ページ {b["pages"]} / 記事 {b["records"]}' f' / 確認済み {b["verified"]} / 確認できず {b["unverified"]} / エラー {b["errors"]}') print("\n== 3. 4つの段階(11/2〜11/5 19:32) ==") user_bots = ["ChatGPT-User", "Claude-User", "PerplexityBot"] crawl = cr["total"] asked = {b["bot"]: b["visits"] for b in cr["byBot"] if b["bot"] in user_bots} refs = {r["from"]: r["count"] for r in ev_h["referrers"]} ai_ref = sum(v for k, v in refs.items() if "chatgpt" in k or "perplexity" in k or "claude.ai" in k or "gemini" in k) print(f"段階1 クローラーが読む: {crawl} 回(1日 {crawl/DAYS_NOW:.0f})") print(f"段階2 利用者の依頼で AI が読む: {sum(asked.values())} 回 {asked}(1日 {sum(asked.values())/DAYS_NOW:.1f})") print(f"段階3 AI の答えのリンクから人が来る: {ai_ref} 回(来た元 {[k for k in refs if 'chatgpt' in k]})") print("段階4 名前で検索される: Search Console で 11/16 に見る(今回は見ていない)") print(f"参考 人のページ表示: {ev_h['byWeek'][0]['views']} 回(1日 {ev_h['byWeek'][0]['views']/DAYS_NOW:.1f})") print("\n== 4. 「AIで読む」ボタン ==") for v in cr["byVia"]: print(f' via={v["via"]}: {v["visits"]} 回 / 記事 {v["records"]} / {v["bots"]}') amazon = sum(int(s.split()[-1]) for v in cr["byVia"] for s in v["bots"].split("、") if s.startswith("Amazonbot")) via_total = sum(v["visits"] for v in cr["byVia"]) print(f" 合計 {via_total} 回のうち Amazonbot {amazon} 回({amazon/via_total*100:.1f}%)") print(" 前の週:", cr_all["byViaWeek"][-1]) btn = [c for c in ev_h["clicks"] if "AIで読む" in c["target"]] print(f" 人がボタンを押した記録(ev-stats): {btn}") print("\n== 5. 人の来た元・よく見られたページ(11/2 の週) ==") for r in ev_h["referrers"]: print(f' {r["from"]}: {r["count"]}') for p in ev_h["byPage"][:12]: print(f' {p["path"]}: {p["views"]} 回 / 中央値 {p.get("medianSeconds")}秒 / 75%以上 {p.get("read75Pct")}%') print("\n== 6. 改善 No.01 の確かめ(10/29 から・人だけ) ==") gpu = [p for p in ev_h29["byPage"] if p["path"] == "/gpu-buy-or-rent"] print(f" /gpu-buy-or-rent: {gpu}") hits = [c for c in ev_h29["clicks"] if any(k in c["target"] for k in ["#calc", "|now", "|files"])] print(f" #calc・now・files のクリック: {hits if hits else 0}") print(f" 押された場所: {[(a['area'], a['count']) for a in ev_h29['areas']]}") print("\n== 7. 改善 No.02 の確かめ(11/2 から・404) ==") e = cr["errors"] print(f" 404 の住所 {len(e)} 種類・{sum(x['visits'] for x in e)} 回") print(f" LOG361 の古い住所: {[x for x in e if 'LOG361' in x['path']] or 0} / /ai-agent: {[x for x in e if 'ai-agent' in x['path']] or 0}") brace = [x for x in e if "%7B" in x["path"] or "%20%2B%20" in x["path"]] print(f" コードの中の文字列を住所と読んだもの: {len(brace)} 種類・{sum(x['visits'] for x in brace)} 回") print(f" それ以外: {[(x['path'], x['visits']) for x in e if x not in brace]}") print("\n== 8. ハコブくん(機械の印なし) ==") for w in hk["byWeek"]: print(f' {w["week"]}: 出た {w["shown"]} / 押した {w["click"]} / あとで見に来た {w["later"]}' f' / 押した割合 {w["click"]/w["shown"]*100:.1f}%')