🔥

【覚書】大規模サイトのテクニカルSEO手順

に公開

大手企業の大規模なサイトの技術的なSEOのコンサルを担当することになりました。
ページリストを作りたいと思いましたが、それだけで大変な労力になります。


91時間経過しているが、全然終わらない。
screaming frogを使えばよかったのですが、

1.調査対象のディレクトリのページをクロール

サイトマップを辿れば、普通はページを全部洗い出せます。
ただし、中にはサイトマップが死んでいるサイトも多数ございます。
サイトマップがない場合は、Pythonで自分でクローラーを作り、クローリングしてページを洗い出します。

URL・ページタイトル・meta description をCSVファイルに出力する方法を解説します。

1. 準備環境

必要なもの

  • Python 3.9 以上
  • ターミナル(macOS)またはコマンドプロンプト(Windows)
  • インターネット接続

Pythonが未インストールの場合

  1. https://www.python.org/downloads/ にアクセス。
  2. 最新版をダウンロードし、インストール時に「Add Python 3.x to PATH」にチェックを入れて実行

2. 必要ライブラリのインストール

以下のコマンドを実行して、必要なライブラリを導入します。

pip install requests beautifulsoup4 tqdm pandas

💡 pandasはCSV出力を便利に行うために使用します。

3. スクリプトの作成

手順

  1. メモ帳やVS Codeなどのエディタを開きます。
  2. 下記のスクリプトをコピーして貼り付けます。
  3. ファイル名を crawl_scvb_csv.py として保存します。

🧑‍💻 スクリプト全文

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
from tqdm import tqdm
import pandas as pd
import time

BASE_URL = "https://xxx.com/●●●/"
DOMAIN = urlparse(BASE_URL).netloc
OUTPUT_FILE = "xxx_pages.csv"

visited = set()
to_visit = [BASE_URL]
results = []

def is_valid_url(url):
    """●●●配下かつ同一ドメインのURLのみ対象"""
    parsed = urlparse(url)
    return parsed.netloc == DOMAIN and parsed.path.startswith("/scvb/")

pbar = tqdm(total=1, desc="Crawling", unit="page")

while to_visit:
    url = to_visit.pop(0)
    if url in visited:
        continue
    visited.add(url)

    try:
        resp = requests.get(url, timeout=10)
        if resp.status_code != 200:
            continue
    except Exception as e:
        print(f"⚠️ {url} の取得に失敗: {e}")
        continue

    soup = BeautifulSoup(resp.text, "html.parser")

    # タイトルとmeta descriptionを取得
    title = soup.title.string.strip() if soup.title and soup.title.string else ""
    desc_tag = soup.find("meta", attrs={"name": "description"})
    desc = desc_tag["content"].strip() if desc_tag and "content" in desc_tag.attrs else ""

    # 結果をリストに追加
    results.append({
        "URL": url,
        "Title": title,
        "Description": desc
    })

    # 次のリンクを探索
    for a in soup.find_all("a", href=True):
        href = a["href"].strip()
        abs_url = urljoin(url, href).split("#")[0]
        if is_valid_url(abs_url) and abs_url not in visited:
            to_visit.append(abs_url)

    pbar.update(1)
    time.sleep(0.5)

pbar.close()

# CSVとして出力
df = pd.DataFrame(results)
df.to_csv(OUTPUT_FILE, index=False, encoding="utf-8-sig")

print(f"\n✅ クローリング完了。総ページ数: {len(results)} 件")
print(f"📄 出力ファイル: {OUTPUT_FILE}")

4. スクリプトの実行方法

Windowsの場合

  1. コマンドプロンプトを開く。

  2. スクリプトを保存したフォルダへ移動:

    cd Desktop
    
  3. スクリプトを実行:

    python crawl_scvb_csv.py
    

macOSの場合

cd ~/Desktop
python3 crawl_scvb_csv.py

実行すると、以下のような画面が大規模サイトだとこのクロール時間が非常に長くなってしまいます。

5. 出力結果の確認

実行が完了すると、同じフォルダに

xxx_●●_pages.csv

というファイルが作成されます。

6. よくあるエラーと対処法

エラー内容 対処法
ModuleNotFoundError pip install requests beautifulsoup4 tqdm pandas を再実行
UnicodeEncodeError Windowsの場合、chcp 65001 を実行してUTF-8モードに変更
TimeoutError 回線が不安定な場合。time.sleep() の秒数を1秒に増やすと安定
Permission denied CSVファイルを開いたまま実行していないか確認

7. 注意事項

  • クローリング対象が robots.txt で禁止されていないことを必ず確認してください。
  • 大量アクセスを避けるため、time.sleep(0.5) で間隔を空けています。必要に応じて調整可能です。
  • 商用サイトや他社サイトを無断でクローリングする場合は、法的リスクを考慮してください。

8. まとめ

このスクリプトを使用すれば、
https://xxx.com/●●●/ 配下の全ページURL・タイトル・meta descriptionを
CSV形式で簡単に収集・保存できます。

SEO調査やサイト構造分析に非常に便利です。


ご希望があれば、次のような派生版も作成可能です:

  • ⚡️ 非同期クローリング版(10倍高速)
  • 🧩 タイトル・ディスクリプションの文字数チェック付き版
  • 🗂 出力ファイルをGoogleスプレッドシートに自動連携する版

どのバージョンを追加しましょうか?

Discussion