Claudeでメタディスクリプションとtitleを一括で下書きして検査する
URL・現行title・主要クエリのCSVをClaudeに渡して案を出させ、表示幅・重複・クエリ語の抜けをスクリプトで検査する手順です。検査コード付き。
titleとmeta descriptionの一括作成は、下書きをClaude、合否判定をスクリプトに分けると回る
数十ページ分のtitleとmeta descriptionを書き直すとき、Claudeに「全部直して」と頼むだけでは、出てきた案が基準を満たしているかを人が一行ずつ数えることになります。分け方はこうです。案を出すのはClaude、字数・重複・クエリ語の抜けといった数えられる項目の判定は数十行のスクリプトに任せます。人が見るのは、スクリプトが通した案がページの中身と合っているかどうかだけです。
渡すのはURL、現行title、現行description、主要クエリ、ページの要約を並べたCSVです。返してもらうのも、列を固定したCSVにします。返答が表の形で戻れば、そのまま検査スクリプトに流せるためです。
一括作成の流れ
- 1
入力CSVを作る
URL、現行title、主要クエリ、ページ要約を1行1ページで並べます。
- 2
Claudeに案を出させる
出力の列名と条件を指定し、CSVだけを返させます。
- 3
スクリプトで検査する
幅・重複・空欄・クエリ語の抜けを機械的に洗い出します。
- 4
指摘行だけ作り直す
通らなかった行だけをClaudeに戻し、通った行には触りません。
- 5
人が中身を確認する
ページの内容と案が食い違っていないかを目で見ます。
どのページから直すかの選び方は、Search ConsoleのCSVでリライト優先度を決める記事にあります。この記事は、優先度が決まったページ群に対して、titleとdescriptionの案を出して検査する工程を扱います。
入力CSVに入れる列
列は次の5つで足ります。
| 列名 | 中身 | 用途 |
|---|---|---|
| url | 中身ページのURL | 用途行の識別 |
| current_title | 中身現行のtitle | 用途変更前後の比較 |
| current_description | 中身現行のdescription | 用途同上 |
| main_query | 中身狙うクエリ(空白区切り) | 用途案に入れる語の指定 |
| page_summary | 中身ページの要点を1〜2文 | 用途案をページ内容に結びつける根拠 |
main_queryはSearch Consoleのクエリ別CSVから、ページごとに表示回数の多いものを1つ選んで貼ります。page_summaryは、Claudeに本文から作らせて人が目を通す方法でも、記事の冒頭段落をそのまま入れる方法でも構いません。ここが空だと、Claudeはクエリとtitleの現行文言から推測で書くしかなく、案がページの中身から離れます。
Claudeに渡すプロンプト
出力形式と条件を先に固定し、判断の余地を残さないのがコツです。
添付のCSVの各行について、新しいtitleとmeta descriptionを作ってください。
出力は次の列のCSVだけにしてください。説明文は不要です。
url,main_query,new_title,new_description
条件:
1. main_queryの語を、new_titleとnew_descriptionの両方に入れる
2. new_titleは全角30字以内、new_descriptionは全角30〜60字
3. page_summaryに書かれていない事実・数字・効果は入れない
4. 全行でnew_title、new_descriptionが互いに重複しないようにする
5. 全行にnew_titleとnew_descriptionを入れ、空欄にしない。現行titleと同じ文は返さない条件5のとおり、空欄の行は作りません。titleを変えたくないページは、入力CSVの段階で外しておきます。検査スクリプトは空欄を不備として数えるので、変えない行を空で返させると毎回指摘されます。
条件3は特に重要です。「3分でできる」「必ず上がる」のような、ページに書かれていない約束をClaudeが補ってしまうと、検索結果で見た内容とページの中身が食い違います。page_summaryに根拠がないものは入れさせない、と明示しておきます。
行数が多いときは、50行前後に区切って依頼し、列名と条件は毎回同じものを貼ります。長い一括依頼では後半の行で条件が崩れやすいので、まず数行で試して出力形式が守られるかを見てから本番の行数を渡します。
検査スクリプト
Claudeの返したCSVをout.csvとして保存し、次のスクリプトに通します。表示幅は半角を1、全角を2として数えます。標準ライブラリだけで動くので、インストールは要りません。
check_meta.py の全文
import csv, sys, unicodedata
from collections import Counter
TITLE_MAX, DESC_MIN, DESC_MAX = 60, 60, 120 # 表示幅(半角=1, 全角=2)
def width(s):
return sum(2 if unicodedata.east_asian_width(c) in "WF" else 1 for c in s)
rows = list(csv.DictReader(open(sys.argv[1], encoding="utf-8-sig")))
titles = Counter(r["new_title"] for r in rows)
descs = Counter(r["new_description"] for r in rows)
bad = 0
for r in rows:
problems = []
t, d, q = r["new_title"], r["new_description"], r["main_query"]
if not t:
problems.append("title空欄")
else:
if width(t) > TITLE_MAX: problems.append(f"title幅{width(t)}")
if titles[t] > 1: problems.append("title重複")
missing_t = [w for w in q.split() if w.casefold() not in t.casefold()]
if missing_t: problems.append("title欠落語:" + ",".join(missing_t))
if not d:
problems.append("desc空欄")
else:
if not DESC_MIN <= width(d) <= DESC_MAX: problems.append(f"desc幅{width(d)}")
if descs[d] > 1: problems.append("desc重複")
missing_d = [w for w in q.split() if w.casefold() not in d.casefold()]
if missing_d: problems.append("desc欠落語:" + ",".join(missing_d))
if problems:
bad += 1
print(r["url"], " / ".join(problems))
print(f"{len(rows)}件中{bad}件に指摘")python3 check_meta.py out.csvURLとクエリ、案が4行だけの小さなCSV(2行目は説明文が短すぎる、3行目は1行目と説明文が同じ、4行目は説明文が空)で動かすと、次のように出ます。
/a desc重複
/b desc幅6 / desc欠落語:claude,要約
/c desc重複 / desc欠落語:見積書
/d desc空欄
4件中4件に指摘行ごとに「どのURLの何が通らなかったか」が1行で出るので、そのまま指摘行だけをClaudeに戻せます。
次の行だけ作り直してください。指摘を直し、ほかの条件は同じです。
/b: 説明文が短すぎる。main_queryの語を含めて全角30〜60字にする
/c: 説明文が/aと同じ。ページごとに違う文にする幅の基準は自分で決める
スクリプト冒頭のTITLE_MAX、DESC_MIN、DESC_MAXは、運用上の目安として置いた値です。Google側の記述では、<title>要素の長さに上限はなく、検索結果では端末の幅に合わせて切り詰められるとされています。meta descriptionも同様に、長さの上限はなく、スニペットが必要に応じて切り詰められます。つまり「何字以内なら必ず全文が出る」という数字は公式にはありません。自サイトの過去のtitleを検索結果で見て、切れ方を確かめたうえで数字を調整してください。
スクリプトで検査できること、できないこと
検査できるのは、数えれば決まる項目です。Googleの説明と照らすと、次のように対応します。
| 検査項目 | Googleの説明との対応 | スクリプトで判定 |
|---|---|---|
| titleの重複 | Googleの説明との対応ページごとに異なるtitleを書く。定型文だけが違うtitleは避ける | スクリプトで判定できる |
| descriptionの重複 | Googleの説明との対応サイト全体で同じdescriptionを使い回さない | スクリプトで判定できる |
| descriptionが短すぎる | Googleの説明との対応短すぎる例(語だけ)は具体性に欠ける | スクリプトで判定幅の下限で近似できる |
| 空欄 | Googleの説明との対応全ページにtitleを指定する | スクリプトで判定できる(titleとdescriptionの両方) |
| クエリ語の抜け | Googleの説明との対応titleとdescriptionで内容を端的に示す | スクリプトで判定語の有無だけ判定できる |
| キーワードの羅列 | Googleの説明との対応キーワードを詰め込まない。羅列のdescriptionは表示されにくい | スクリプトで判定完全には判定できない |
| ページ内容との一致 | Googleの説明との対応内容を表さないtitleはGoogleが別の文言に差し替えることがある | スクリプトで判定できない |
| 言語・文字種の一致 | Googleの説明との対応ページ本文と同じ言語で書く | スクリプトで判定できない |
下の3行は、人かClaudeによる別観点の点検の領分です。特にページ内容との一致は、スクリプトが全部通した後に最も事故が起きやすい項目です。クエリ語を無理に押し込んだ結果、ページに書かれていないことを約束する案になっていることがあります。
人が見るときの観点
通った案を見るときは、次の3点に絞ります。
- ページの見出しや冒頭の段落と、titleが同じ話をしているか
- descriptionに、ページにない数字や効果が入っていないか
- 狙うクエリの語が不自然に連呼されていないか
Googleは、titleに同じ語を何度も入れることを避けるよう説明しています。クエリ語を入れる条件を「両方に1回ずつ」と書いておけば、Claudeがクエリ語を重ねて水増しする案は出にくくなります。それでも出たものは、この3点目で拾えます。
サイト名の付け方もルールにしておく
titleの末尾にサイト名を付ける運用なら、その規則も条件に入れておきます。Googleは、サイト名のような追加情報はトップページのtitleに置くのが妥当で、全ページに長い紹介文を付けると、同じサイトの複数ページが同じ検索で並んだときに繰り返しに見えると説明しています。各ページには、サイト名だけを先頭か末尾に、ハイフン・コロン・パイプなどの区切りを挟んで付ける形が例に挙がっています。
この規則はスクリプトにも書けます。たとえば「new_titleが決めたサイト名で終わること」「サイト名が2回出ないこと」を検査項目に足せば、Claudeが区切りの記号を行ごとに変えたり、サイト名を落としたりした行を拾えます。サイト名を含めた幅で数えるのか、本文部分だけで数えるのかも、このとき決めておきます。
Claude Codeにスクリプトの実行まで任せる
CSVをチャットに貼る方法だと、検査は自分の手元で実行して結果を戻すことになります。Claude Codeを使えるなら、作業フォルダにin.csvとcheck_meta.pyを置き、「in.csvの案を出してout.csvに保存し、check_meta.pyが指摘ゼロになるまで直して」と頼む形にできます。検査の失敗が出力として返るので、指摘行の修正を繰り返させられます。
ただし、スクリプトが通ることと案が良いことは別です。ゼロ指摘になるまで回した結果が、クエリ語を無理に差し込んだだけの案でも、スクリプトは何も言いません。最後に人が見る工程は省けません。変更前後を並べて確認できるよう、出力CSVにはcurrent_titleの列も残しておくと、差分の確認が楽になります。
反映したあとに起きること
案を採用してページを更新しても、検索結果の表示はすぐには変わりません。Googleは、title linkの元になる要素を更新してから反映されるまでに、ページの再クロールと再処理に数日から数週間かかることがあると説明しています。変更後すぐに「効かない」と判断せず、再クロールを待ちます。
もうひとつ知っておきたいのは、<title>要素に書いた文言がそのまま検索結果に出るとは限らない点です。title linkは、<title>要素のほか、<h1>などの見出し、画面上で目立つ文字、og:title、ページを指すリンクのアンカーテキストなど複数の情報源から自動で決まります。titleを書き直しても表示が変わらないときは、<h1>が別の話をしていないか、最も目立つ見出しが複数ないかを先に確かめてください。Googleは、ページの内容を正しく表していない<title>や、全ページで定型文が同じ<title>を、別の文言に差し替えることがあるとしています。
meta descriptionも同様です。スニペットは主にページ本文から作られ、meta descriptionのほうがページを正確に説明していると判断されたときに使われます。descriptionを丁寧に作っても、検索ごとに別の文面が出ることがあります。
よくあるつまずき
- 出力にCSV以外の文が混ざる: 「CSVだけを返す」と指定しても、前置きが付くことがあります。保存前に先頭行が列名であることを確かめます。
- カンマを含む文でCSVが崩れる: descriptionに読点でなく半角カンマが入ると列がずれます。ダブルクォートで囲むよう条件に足すか、タブ区切りで返させます。
- 全行が同じ型の文になる: 「Claudeで〜する手順」が並ぶと、スクリプトの重複判定は通っても、一覧では見分けがつきません。型の偏りは機械では出ないので、一覧を目で眺めます。
- 変更の効果を取り違える: 案を反映した月の表示回数や順位の変化は、季節要因なども混ざります。測り方はSearch Console APIで順位を定点観測する記事の手順が使えます。
まとめ
Claudeに任せるのは、列を固定したCSVで案を出すところまでです。幅、重複、空欄、クエリ語の抜けは数十行のスクリプトで落とし、通った案をページの中身と見比べて採用します。Googleが長さに数字の上限を置いていない以上、幅の基準は自サイトの検索結果の見え方から決めるものになります。