2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🐦 X(旧Twitter)ユーザー情報をCSVで一括取得するPythonスクリプトを書いた話

Last updated at Posted at 2025-07-23

こんにちは、tampopo256です。

大学のイベントでSNSアカウントの分析や整理をする中で、「複数のXアカウントの情報を一括で取得してCSVにまとめたい」というニーズがありました。

そこで、twikitというライブラリを使って、簡単にXユーザー情報をCSVで取得できるスクリプトを作ったので紹介します。

このスクリプトはX(旧Twitter)の利用規約に違反しています。

X(旧Twitter)では明確にスクレイピング行為を禁止しており、非公式APIを用いた情報取得や自動化行為により、アカウントが一時停止・凍結される可能性があります。

本記事は「こういった技術的手法がある」という技術紹介目的であり、筆者およびその所属団体・組織は実際の運用や業務利用を推奨しておりません。

実際に使用する際は必ずX社の利用規約および開発者ポリシーを確認の上、自己責任で行ってください。

✅ やりたいこと

  • X(旧Twitter)の@ユーザー名一覧が入ったCSVファイルを読み込む
  • twikit を使ってユーザー情報(名前、ID、フォロワー数など)を取得
  • 結果を別のCSVファイルとして保存する

📦 使用ライブラリ

  • twikit:X非公式APIクライアント
  • asyncio:非同期処理で高速化
  • csv:読み書き処理
pip install twikit

📄 スクリプト全体

import asyncio
import csv
from twikit import Client

INPUT_FILE = "users.csv"
OUTPUT_FILE = "output.csv"

def clean_user_data(user, identifier):
    safe_keys = {
        k: v
        for k, v in user.__dict__.items()
        if not k.startswith("_") and isinstance(v, (str, int, float, bool, type(None)))
    }
    safe_keys["入力ID"] = identifier
    return safe_keys

async def fetch_user_data(client, identifier):
    if identifier.strip() == "-":
        return {"入力ID": identifier}
    try:
        user = await client.get_user_by_screen_name(identifier.strip())
        return clean_user_data(user, identifier)
    except Exception as e:
        return {"入力ID": identifier, "error": str(e)}

async def main():
    client = Client()
    await client.login(
        auth_info_1="YOUR_ID",         # あなたのXログインID
        password="YOUR_PASSWORD",      # あなたのパスワード
        cookies_file="cookies.json"    # Cookieファイルでセッション維持
    )

    results = []
    all_keys = set()

    with open(INPUT_FILE, newline='', encoding='utf-8') as infile:
        reader = csv.reader(infile)
        for row in reader:
            identifier = row[0].strip()
            print(f"🔍 {identifier} を取得中...")
            user_data = await fetch_user_data(client, identifier)

            results.append(user_data)
            all_keys.update(user_data.keys())

    with open(OUTPUT_FILE, "w", newline='', encoding='utf-8') as outfile:
        fieldnames = ["入力ID"] + sorted(k for k in all_keys if k != "入力ID")
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        writer.writeheader()
        for row in results:
            writer.writerow(row)

    print(f"✅ 完了しました: {OUTPUT_FILE}")

if __name__ == "__main__":
    asyncio.run(main())

🔧 入力CSVの形式

例えば以下のような users.csv を用意します。

kurosangurasu
elonmusk
jack
-
  • - はスキップされ、空データとして処理されます

🧠 補足ポイント

  • twikit はログインが必要です(初回は手動でログイン、以降 cookies.json を使って再利用可能)
  • user.__dict__ から _ で始まる内部情報を除外し、安全なデータだけをCSVに出力します
  • 取得できなかったアカウントは "error" キーにエラーメッセージが記録されます
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?