PythonとDuckDuckGo Searchで実現!「茨城県境町 教育移住」情報をDynamoDBに保存する自動化スクリプト

1. はじめに

地域の教育移住に関する情報は、移住を検討している私にとって非常に有用です。そこで、Pythonのライブラリ「duckduckgo_search」を活用して、リアルタイムな検索結果を自動的に収集し、DynamoDBに記録する仕組みを実装しました。 このスクリプトは、環境変数管理(dotenv)、DuckDuckGoの検索結果取得、データの整形、そしてDynamoDBへのデータ投入までを一貫して行います。

2. DuckDuckGoとは?

DuckDuckGoは、プライバシーに配慮した検索エンジンです。以下の点が特徴です:

  • プライバシー重視: ユーザーの検索履歴や個人情報を追跡せず、匿名で検索結果を提供します。
  • シンプルなインターフェース: 広告やトラッキングを最小限に抑え、クリーンなデザインで直感的に利用できます。
  • 多様な検索結果: インターネット上の最新情報やニュース、画像などを幅広く取得可能。
  • 本コードでは、Pythonライブラリ「duckduckgo_search」を利用して、DuckDuckGoの検索結果を簡単に取得しています。

duckduckgo.com

3. DynamoDBとは?

Amazon DynamoDBは、AWSが提供するNoSQLデータベースサービスです。

  • 高いスケーラビリティ: 大量のデータやトラフィックにも対応できる設計。
  • 高速なパフォーマンス: ミリ秒単位の低レイテンシでデータ操作が可能。
  • 管理の手軽さ: サーバーレスアーキテクチャにより、インフラ管理が不要。
  • 柔軟なデータモデル: キーバリュー型およびドキュメント型データストアとして利用できるため、さまざまなユースケースに対応可能。
  • 使い方次第では、安価。開発初期にはGood。

本記事で実装するスクリプトでは、検索結果をDynamoDBに記録し、後から時系列でデータを確認できるように設計しています。

aws.amazon.com

aws-rough.cc

4. 主な機能の解説

4.1 検索結果の取得

search_word関数では、以下のポイントに注目しています:

  • 検索キーワード: 「茨城県境町 教育移住」
  • イムリミット: 過去1週間(timelimit="w")
  • 最大取得件数: 20件
  • セーフサーチ設定: ON(安全な検索結果を取得)
def search_word(query: str):
    '''
    検索ワードを指定して、DDGSで検索結果を取得する
    '''
    with DDGS() as ddgs:
        results = list(ddgs.text(
            keywords=query,       # 検索ワード
            region='jp-jp',       # リージョン 日本
            safesearch='on',      # セーフサーチON
            timelimit="w",        # 過去1週間の結果
            max_results=20        # 取得件数20件
        ))
        return results

4.2 データの整形

取得した検索結果をループ処理で整形し、DynamoDB用のPut形式に変換しています。

  • 各件は、"01件目", "02件目"といったキーで保存
  • 各結果にはタイトル、本文、URLが含まれています
put_data = {}
for i, result in enumerate(results):
    # 01件目, 02件目, ... という形でデータを格納
    put_data[f'{str(i+1).zfill(2)}件目'] = { 
        "M" : { 
            "title": { "S": result.get('title', "") },
            "body": { "S": result.get('body', "") },
            "url": { "S": result.get('url', "") }
        }
    }

4.3 DynamoDBへのデータ投入

DynamoDBへの登録は、AWS SDK(boto3)を利用しています。

項目 説明
テーブル名 kunio-relocate
パーティションキー 固定値 relocating#2025
ソートキー 実行時のタイムスタンプ(date_str
データマップ 整形済みの検索結果データをそのまま投入

※ マークダウンで表を書くの慣れてきました。

client = boto3.client(
    'dynamodb',
    region_name='', #リージョンを指定
    aws_access_key_id=os.getenv("aws_access_key_id", None),
    aws_secret_access_key=os.getenv("aws_secret_access_key", None)
)

# 現在の日時を取得し、ソートキーに設定
now = datetime.now()
date_str = now.strftime('%Y-%m-%d_%H:%M:%S')

response = client.put_item(
    TableName='kunio-relocate',
    Item={
        'id': {
            'S': 'relocating#2025'
        },
        'sortKey': {
            'S': date_str
        },
        'dataMap': {
            'M': put_data
        }
    }
)

5. まとめと今後の展開

今回紹介したコードは、特定のキーワードで検索した結果を自動的にDynamoDBへ保存する基本的な仕組みです。 今後の改善点としては、以下が考えられます:

  • エラーハンドリングの強化

kunio-ud-zatta.hatenablog.com

  • 検索結果の更なるフィルタリング(重複の除去や特定キーワードの強調)
  • DynamoDBに格納する際のデータ構造の最適化
  • 何で検索したかを保持 この仕組みを活用することで、教育移住に関する最新情報を自動的に集約でき、情報収集の手間を大幅に軽減できます。 1週間に1回取得して、3か月くらい溜まったら、OpenAIとかに調べてどのような傾向があるかをみてもらおうかな。