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

91時間経過しているが、全然終わらない。
screaming frogを使えばよかったのですが、
1.調査対象のディレクトリのページをクロール
サイトマップを辿れば、普通はページを全部洗い出せます。
ただし、中にはサイトマップが死んでいるサイトも多数ございます。
サイトマップがない場合は、Pythonで自分でクローラーを作り、クローリングしてページを洗い出します。
URL・ページタイトル・meta description をCSVファイルに出力する方法を解説します。
1. 準備環境
必要なもの
- Python 3.9 以上
- ターミナル(macOS)またはコマンドプロンプト(Windows)
- インターネット接続
Pythonが未インストールの場合
- https://www.python.org/downloads/ にアクセス。
- 最新版をダウンロードし、インストール時に「Add Python 3.x to PATH」にチェックを入れて実行
2. 必要ライブラリのインストール
以下のコマンドを実行して、必要なライブラリを導入します。
pip install requests beautifulsoup4 tqdm pandas
💡 pandasはCSV出力を便利に行うために使用します。
3. スクリプトの作成
手順
- メモ帳やVS Codeなどのエディタを開きます。
- 下記のスクリプトをコピーして貼り付けます。
- ファイル名を
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の場合
-
コマンドプロンプトを開く。
-
スクリプトを保存したフォルダへ移動:
cd Desktop -
スクリプトを実行:
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