🏊♂️
ライブドアブログとnoteの記事をWordpressへ移行する 14
趣味の水泳関連の記事が、ライブドアブログとnoteの2つのプラットフォームに分散してしまいました。
これらの記事を新設したWordpressに集約して公開するまで、作業を記録していこうと思います。
移行元の記事数は、
ライブドアブログ:904件 https://waist100.blog.jp/
note:160件
です。
タスク一覧
-
移行元1 Livedoor Blog
- done 引っ越し先URLを投稿する
-
移行元2 note
- 記事160件を非公開化する
- 引っ越し先のURLを投稿する
-
一時サーバ XREA free
- done no-ip登録のサブドメインを削除する
- done WPメンテナンスモードプラグインを有効化する
-
移行先 シンフリーサーバ
- done 160件の記事のリライトを行う
- done 移行漏れ記事1件を手作業で作成する
- done LIKEボタンの表記を変更する(「スキ」「キライ」)
-
SEO Google Search console
- done シンフリーサーバーのURL登録
- done サイトマップの登録
- Search console インデックス登録一括リクエスト
-
SEO Google Analytics 4の設定
- done Search console と GA4の連携
今日の作業
URLインデックス登録は200件弱行いましたが、サイトマップによる登録もすすんでいるため、
現在の登録状況を確認してみました。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import csv
from urllib.parse import urlparse
from google.oauth2 import service_account
from googleapiclient.discovery import build
# 設定
CREDENTIALS_FILE = 'service-account.json'
URLS_FILE = 'urls.txt'
OUTPUT_FILE = 'index_results.csv'
def extract_site_url_for_api(urls):
"""URLリストからサイトルートを抽出(API用の形式)"""
if not urls:
return None
parsed = urlparse(urls[0])
# URLプロパティの場合: https://example.com/
return f'{parsed.scheme}://{parsed.netloc}/'
def authenticate():
"""Google Search Console APIで認証"""
scopes = ['https://www.googleapis.com/auth/webmasters.readonly']
credentials = service_account.Credentials.from_service_account_file(
CREDENTIALS_FILE, scopes=scopes
)
return build('searchconsole', 'v1', credentials=credentials)
def check_index_status(service, site_url, url):
"""個別URLのインデックス状態を確認"""
try:
request_body = {
'inspectionUrl': url,
'siteUrl': site_url
}
request = service.urlInspection().index().inspect(body=request_body)
response = request.execute()
# インデックス状態を抽出
inspection_result = response.get('inspectionResult', {})
index_status = inspection_result.get('indexStatusResult', {})
coverage_state = index_status.get('coverageState', 'UNKNOWN')
# 大文字小文字を区別せず'indexed'が含まれているかで判定
is_indexed = 'indexed' in str(coverage_state).lower()
return {
'url': url,
'indexed': is_indexed,
'coverage_state': coverage_state,
'last_crawl_time': index_status.get('lastCrawlTime', 'N/A'),
'indexing_state': index_status.get('indexingState', 'N/A'),
'status': 'SUCCESS'
}
except Exception as e:
return {
'url': url,
'indexed': False,
'coverage_state': 'ERROR',
'last_crawl_time': '',
'indexing_state': '',
'status': f'ERROR: {str(e)}'
}
def main():
# 認証
print('Google Search Console APIで認証中...')
service = authenticate()
# URLリストを読み込む
if not os.path.exists(URLS_FILE):
print(f'エラー: {URLS_FILE} が見つかりません')
return
with open(URLS_FILE, 'r', encoding='utf-8') as f:
urls = [line.strip() for line in f if line.strip()]
if not urls:
print('エラー: URLリストが空です')
return
# サイトURLを自動抽出
site_url = extract_site_url_for_api(urls)
print(f'読み込まれたURL数: {len(urls)}')
print(f'サイトURL: {site_url}')
print('---')
# 各URLのインデックス状態を確認
results = []
indexed_count = 0
not_indexed_count = 0
error_count = 0
for i, url in enumerate(urls, 1):
print(f'[{i}/{len(urls)}] チェック中: {url}')
result = check_index_status(service, site_url, url)
results.append(result)
if result['status'] == 'SUCCESS':
if result['indexed']:
indexed_count += 1
print(f' → インデックス登録済み')
else:
not_indexed_count += 1
print(f' → 未登録 ({result["coverage_state"]})')
else:
error_count += 1
print(f' → エラー: {result["status"]}')
# 結果をCSVで保存
with open(OUTPUT_FILE, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['url', 'indexed', 'coverage_state', 'indexing_state', 'last_crawl_time', 'status'])
writer.writeheader()
writer.writerows(results)
# 統計情報を表示
print('---')
print(f'チェック完了!')
print(f'インデックス登録済み: {indexed_count}件')
print(f'未登録: {not_indexed_count}件')
print(f'エラー: {error_count}件')
print(f'結果を保存: {OUTPUT_FILE}')
if __name__ == '__main__':
main()
出力結果
[1063/1065] チェック中: https://waist100.cloudfree.jp/18/
→ 未登録 (URL is unknown to Google)
[1064/1065] チェック中: https://waist100.cloudfree.jp/17/
→ インデックス登録済み
[1065/1065] チェック中: https://waist100.cloudfree.jp/16/
→ 未登録 (URL is unknown to Google)
---
チェック完了!
インデックス登録済み: 549件
未登録: 516件
エラー: 0件
結果を保存: index_results.csv
ある程度登録が進んでいるので、前回行った200件ごとの手動によるURLインデックス登録は不要としました。
残タスク
- 旧サイトのクローズ
- note記事の非表示化 (1週間後)
Discussion