🏊‍♂️

ライブドアブログと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

  • SEO Google Analytics 4の設定

今日の作業

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