AIクローラーに本文は届いているか。JavaScriptを動かさずに受け取ったHTMLを、WordPress時代(Wayback Machineの保存分)と静的サイトに移した今とで測って比べた。本文の文字数、目次、公開日、著者、構造化データ
JavaScriptを
この
この
各社のクローラーがJavaScriptを実行するか、公式に書かれていること
JavaScriptを
| クローラー | JavaScriptの |
|---|---|
| Googlebot |
ページを |
| GPTBot・OAI-SearchBot・ChatGPT-User |
記述なし |
| ClaudeBot・Claude-User・Claude-SearchBot |
記述なし |
| PerplexityBot・Perplexity-User |
記述なし |
OpenAI・Anthropic・Perplexityの
Googleの
何を測ったか
測ったのは、
- 本文の
文字数 (記事の 本文の 要素の 中の 文字。 script・style・noscript・template・svgを除き、 空白を 詰めて 数える) title、h1、h2の数- 日付(
time要素のdatetimeと、構造化データの datePublished) - 著者
(構造化データの author) - 構造化データ
(JSON-LD)の 種類 - HTMLの
大きさと scriptタグの数
比べたのは、id_ を
な
測ったスクリプト
URLかarticle .prose と、.post_content を
// JavaScript を動かさずに受け取った HTML に、何が入っているかを数える
// 使い方: node raw-check.mjs <URL または HTMLファイル> [本文のセレクター]
// 必要なもの: Node.js 18以降、cheerio(npm i cheerio)
import { readFile } from "node:fs/promises";
import * as cheerio from "cheerio";
const [src, bodySel = "article .prose, .post_content, article, main"] = process.argv.slice(2);
const html = /^https?:\/\//.test(src)
? await (await fetch(src, { headers: { "user-agent": "raw-check/1.0" } })).text()
: await readFile(src, "utf8");
const $ = cheerio.load(html);
// JSON-LD は先に取り出しておく(あとで script を消すため)
const ld = [];
$('script[type="application/ld+json"]').each((_, el) => {
try {
const walk = (v) => {
if (Array.isArray(v)) return v.forEach(walk);
if (v && typeof v === "object") { ld.push(v); Object.values(v).forEach(walk); }
};
walk(JSON.parse($(el).text()));
} catch { ld.push({ "@type": "(壊れたJSON-LD)" }); }
});
const ldTypes = [...new Set(ld.map((o) => o["@type"]).flat().filter(Boolean))];
const ldArticle = ld.find((o) => /Article|BlogPosting/.test([o["@type"]].flat().join()));
const scripts = $("script").length;
const external = $("script[src]").length;
// 人が読む文字だけを数える(空白は詰める)
$("script, style, noscript, template, svg").remove();
const text = (sel) => $(sel).first().text().replace(/\s+/g, "").length;
const bodyEl = bodySel.split(",").map((s) => s.trim()).find((s) => $(s).length);
const authorLd = ldArticle?.author ? [ldArticle.author].flat().map((a) => a.name ?? a["@id"]).join(" / ") : "";
const result = {
"HTMLのバイト数": Buffer.byteLength(html),
"scriptタグ(うち外部)": `${scripts}(${external})`,
"title": $("title").first().text().trim().slice(0, 40),
"h1の数": $("h1").length,
"h2の数": $("h2").length,
"time要素のdatetime": [...new Set($("main time[datetime], article time[datetime]").map((_, el) => $(el).attr("datetime")).get())].slice(0, 2).join(" / ") || "なし",
"公開日(JSON-LD)": ldArticle?.datePublished ?? "なし",
"著者(JSON-LD)": authorLd || "なし",
"JSON-LDの@type": ldTypes.join(", ") || "なし",
"body全体の文字数": text("body"),
[`本文の文字数(${bodyEl ?? "見つからず"})`]: bodyEl ? text(bodyEl) : 0,
};
for (const [k, v] of Object.entries(result)) console.log(`${k}: ${v}`);3本に--dump-dom で
#!/bin/sh
# 旧WordPress(Wayback Machine の 2026-06-12 の保存分)と、いまのサイトを同じ物差しで測る
# id_ を付けると、Wayback の書き換えやツールバーの無い、保存したときの HTML が返ってくる
CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
while read -r ts path; do
echo "=== $path"
curl -sS -o wp.html "https://web.archive.org/web/${ts}id_/https://yamayamabloglink.com${path}"
echo "--- 旧WordPress(生のHTML、保存日 ${ts})"; node raw-check.mjs wp.html
echo "--- いま(生のHTML)"; node raw-check.mjs "https://www.yamayamabloglink.com${path}"
"$CHROME" --headless --disable-gpu --virtual-time-budget=10000 --dump-dom "https://www.yamayamabloglink.com${path}" > rendered.html 2>/dev/null
echo "--- いま(Chromeで描画した後)"; node raw-check.mjs rendered.html
done <<'LIST'
20260612204954 /bunkei-engineer/
20260612210620 /itgyoukai-yamateyokatta/
20260612212108 /%E3%80%90stripe%E3%80%91next-js-15%E3%81%A8prisma%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E6%A9%9F%E8%83%BD/
LISTWayback Machineにhttps://web.archive.org/cdx/search/cdx?url=yamayamabloglink.com/*&output=json&from=202606&to=202610&filter=mimetype:text/html を
結果:1本目の出力の全文
1本目
=== /bunkei-engineer/
--- 旧WordPress(生のHTML、保存日 20260612204954)
HTMLのバイト数: 228953
scriptタグ(うち外部): 35(23)
title: 【文系】未経験でエンジニアに転職するための3つの流れ | やまやまブログ
h1の数: 1
h2の数: 4
time要素のdatetime: 2023-03-11
公開日(JSON-LD): 2023-03-02T19:55:50+0900
著者(JSON-LD): 津嘉山 洸
JSON-LDの@type: Organization, WebSite, SearchAction, WebPage, Article, ImageObject, Person, BreadcrumbList, ListItem
body全体の文字数: 3071
本文の文字数(.post_content): 2661
--- いま(生のHTML)
HTMLのバイト数: 51708
scriptタグ(うち外部): 12(3)
title: 文系・未経験からエンジニアに転職する流れ3ステップ | やまやまブログ
h1の数: 1
h2の数: 11
time要素のdatetime: 2023-03-02T19:55:50+09:00 / 2026-10-03T13:30:00+09:00
公開日(JSON-LD): 2023-03-02T19:55:50+09:00
著者(JSON-LD): 津嘉山 洸
JSON-LDの@type: BlogPosting, WebPage, ImageObject, Person, Organization, BreadcrumbList, ListItem, CollegeOrUniversity, FAQPage, Question, Answer
body全体の文字数: 5625
本文の文字数(article .prose): 3846
--- いま(Chromeで描画した後)
HTMLのバイト数: 57015
scriptタグ(うち外部): 14(5)
title: 文系・未経験からエンジニアに転職する流れ3ステップ | やまやまブログ
h1の数: 1
h2の数: 11
time要素のdatetime: 2023-03-02T19:55:50+09:00 / 2026-10-03T13:30:00+09:00
公開日(JSON-LD): 2023-03-02T19:55:50+09:00
著者(JSON-LD): 津嘉山 洸
JSON-LDの@type: BlogPosting, WebPage, ImageObject, Person, Organization, BreadcrumbList, ListItem, CollegeOrUniversity, FAQPage, Question, Answer
body全体の文字数: 5625
本文の文字数(article .prose): 3846今のscript タグの
3本まとめた結果
3本とも、
| 記事 | 旧WordPress 生の |
今 生の |
今 |
|---|---|---|---|
| 文系から |
228,953バイト・script 35 |
51,708バイト・script 12 |
本文3,846字 |
| IT業界を |
275,595バイト・script 35 |
74,028バイト・script 12 |
本文7,310字 |
| Next.jsと |
204,846バイト・script 33 |
69,782バイト・script 12 |
本文5,427字 |
分かった
- WordPress時代も、
本文は WordPressは生の HTMLに 入っていた。 サーバーで HTMLを 組み立てて返すので、 JavaScriptを 動かさなくても 本文が 読めました。 「WordPressだから AIに 本文が 届かない」と いう ことは、 この ブログでは 起きていませんでした - WordPress時代の
目次は、 生のJavaScriptで 中身を 入れていた。 HTMLの 目次は、 3本とも 「目次」と いう 見出しだけで、 項目は 空でした (次の 節) - WordPress時代の
画面の 生の日付は、 更新日だった。 HTMLの time要素は3本とも 2つ あり、 どちらも 構造化データの dateModifiedと同じ 日付 (1つには aria-label="更新日")でした。公開日は、 構造化データの datePublishedにしか ありませんでした。 今は、 公開日と 更新日の 両方が time要素と構造化データの 両方に 入っています - HTMLは
約3分の WordPress時代は1〜4分の 1 (2.9〜4.4分の 1)に なった。 1ページ20万〜27万バイトで、 scriptタグが33〜35個 (外部の ファイルが 22〜23個) ありました。 今は 5万〜7万バイトで、 scriptタグは12個 (うち4つは 構造化データ、 外部は 3個)です
著者は、author にArticle と Person など、BlogPosting と FAQPage などです。
WordPress時代、描画して増えたのは目次だけだった(1本で確認)
WordPress時代の
<div class="p-toc -double"><span class="p-toc__ttl">目次</span></div>1本目に
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --disable-gpu --virtual-time-budget=15000 \
--dump-dom "https://web.archive.org/web/20260612204954if_/https://yamayamabloglink.com/bunkei-engineer/" > wp-rendered.html
node -e '
const cheerio=require("cheerio"),fs=require("fs");
const kids=f=>{const $=cheerio.load(fs.readFileSync(f,"utf8"));$("script,style,noscript,template,svg").remove();return $(".post_content").children().map((_,e)=>({tag:e.tagName+"."+($(e).attr("class")||"").split(" ")[0],t:$(e).text().replace(/\s+/g,"")})).get();};
const a=kids("wp.html"),b=kids("wp-rendered.html");console.log(a.length,b.length);
for(let i=0;i<Math.max(a.length,b.length);i++){const x=a[i]||{},y=b[i]||{};if(x.t!==y.t)console.log(i,x.tag,(x.t||"").length,"|",y.tag,(y.t||"").length,(y.t||"").slice(0,200));}'55 56
3 div.p-toc 2 | div.p-toc 157 目次転職する方法①IT用語について勉強する転職する方法②プログラミングを勉強するProgateで勉強するプログラミングスクールで勉強する転職する方法③エージェントサービスに登録して、仕事を探してみる未経験のエンジニアに特化したエージェントサービスに登録するプログラミングを学んで、そのまま転職サポートを受けるまとめ
55 undefined 0 | ol.p-toc__list 155 転職する方法①IT用語について勉強する転職する方法②プログラミングを勉強するProgateで勉強するプログラミングスクールで勉強する転職する方法③エージェントサービスに登録して、仕事を探してみる未経験のエンジニアに特化したエージェントサービスに登録するプログラミングを学んで、そのまま転職サポートを受けるまとめクラス名にpost_content をp-toc post_content -modal と.post_content(本文)だけを
描画したif_ をif_ で
目次は、
User-Agentを変えても、返ってくるHTMLは同じだった
サーバーや
for ua in \
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36; compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot" \
"Mozilla/5.0 (compatible; ClaudeBot)" \
"Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)"; do
curl -s -A "$ua" -o page.html -w "%{http_code} %{size_download} " https://www.yamayamabloglink.com/bunkei-engineer/
md5 -q page.html
done200 51708 fd190228ee70c0321cb1b35b58c35066
200 51708 fd190228ee70c0321cb1b35b58c35066
200 51708 fd190228ee70c0321cb1b35b58c35066
200 51708 fd190228ee70c0321cb1b35b58c35066
200 51708 fd190228ee70c0321cb1b35b58c350665つとも
ただし、
自分のサイトで確かめるときの見どころ
本文が
- 本文と
見出し - 公開日・更新日
(画面に 出す日付と、 構造化データの 日付) - 著者の名前
- 目次や
タブの 中身など、 操作で 開く 部分の 文字
業種にgrep で
ページの
動作確認した環境
確認日は
- macOS 26.6.2、Node.js 22.23.2、cheerio 1.2.0
- Google Chrome 154.0.8037.95
( --headless --dump-dom) - curl 8.7.1
- WordPress時代の
HTMLは、 Wayback Machineに 2026年6月12日に 保存された もの (テーマは SWELL) - 今の
HTMLは、 公開中の www.yamayamabloglink.com (Astro 7で書き出した 静的な HTML)
確かめていない
- 各社の
クローラーが、 この ブログに 来た ときに 実際に JavaScriptや CSSの ファイルを 取りに 来ているか (訪問の 記録から 集計する 予定で、 この 記事の 時点では まだ 数えていません) - 本物の
クローラーの IPアドレスから 取った ときに、 同じ HTMLが 返るか - WordPress時代の
2本目と 3本目を 描画した 後の 文字数 (Wayback Machineで 描画できませんでした) - WordPress時代の、
2026年6月12日より 後の 状態
参照した公式ドキュメント(確認日:2026年10月5日)
- Googlebotが
クロール・レンダリング・インデックスの 3つの 段階で JavaScriptを 処理する こと、 ヘッドレスの Chromiumで 描画して JavaScriptを 実行する こと、 JavaScriptを 実行できない ボットも あるので サーバー側での 描画も 検討すると よい こと → Google 検索セントラル 「JavaScript SEO の 基本を 」理解する - OpenAIの
クローラー (OAI-SearchBot・GPTBot・ChatGPT-User・OAI-AdsBot)の 目的と User-Agent。 JavaScriptの 実行に ついての 記述は 無い → OpenAI 「Overview of OpenAI Crawlers」 - Anthropicの
クローラー (ClaudeBot・Claude-User・Claude-SearchBot)の 目的。 JavaScriptの 実行に ついての 記述は 無い → Anthropic 「Does Anthropic crawl data from the web, and how can site owners block the crawler?」 - Perplexityの
クローラー (PerplexityBot・Perplexity-User)の 目的と User-Agent。 JavaScriptの 実行に ついての 記述は 無い → Perplexity 「Perplexity Crawlers」 - 保存された
URLと 日時の 一覧を 返すCDX API → Internet Archive 「Wayback CDX Server API」
よくある質問
ChatGPTやClaude、PerplexityのクローラーはJavaScriptを実行しますか?
2026年10月5日の
WordPressのサイトは、AIクローラーに本文が届いていないのですか?
この
自分のサイトで、JavaScriptなしのHTMLに本文が入っているかを確かめる簡単な方法は?
curlで
静的サイトに移せば、AI検索に出やすくなりますか?
そうとは