WEIR

Twitter スクレイピングを Python で行う方法 2026

Twitter(X)のスクレイピングを Python で行う 4 つの方法と費用、弱点を比較。標準ライブラリだけで検索結果を CSV に保存するスクリプトと、X の規約の要点まで。


公開 · 更新 · 約 7 分で読めます · Read in English · 阅读中文版

カバー画像:今も使える 4 つの方法

Twitter スクレイピングを Python で行うなら、2026 年は API を呼ぶ方法がいちばん安定しています。

X(旧 Twitter)のポスト(ツイート)を、表やデータセットにしたい人向けです。4 つの方法の費用と弱点を比べ、実行済みの Python スクリプトを載せました。スクリプトが呼ぶ Weir は、私たちが運営する API です。

X アカウントも Cookie もなしで、最初のポストを取得できます。

curl https://api.weirapp.io/v1/x/search \
  -H "Authorization: Bearer $WEIR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "MMX", "fromUsers": ["JAXA_jp"], "limit": 5}'
  1. キーを取得カードなしで登録し、環境変数に入れます。
  2. 条件を決める語句、アカウント、期間、言語を指定します。
  3. ページを送るnextCursor が null になるまで続けます。
  4. CSV に保存Excel で開ける utf-8-sig で書き出します。

Twitter スクレイピングの 4 つの方法(2026 年)

どの方法も、お金、手間、リスクのどれかを払います。2026 年 10 月時点の比較です。

方法 必要なもの 読み取りの費用 壊れるもの
X API 開発者アカウント 1 件 $0.005 予算
OSS ライブラリ ログイン済みの X 無料 コードとアカウント
X のアーカイブ 自分のログイン 無料 自分のポストだけ
従量課金の API API キー 1 件 1 クレジット 第三者に依存

X API は、ほかのアカウントのポストを読む公認の方法です。10 月 26 日に確認した料金ページの値です。

$0.005ポスト 1 件の読み取り
$0.010プロフィール 1 件
300 万月の読み取り上限、その先は Enterprise

「月 $100 の Basic」と書く解説は古く、今はサブスクリプションがありません。詳しくは X API の料金 にまとめました。

OSS ライブラリは、x.com の Web アプリの非公開エンドポイントを呼びます。GitHub と PyPI で 10 月 25 日に確認した状態です。

  • snscrape:最後のリリースは 2023 年 6 月です。課題 #996「All Twitter scrapes are failing」は今も開いたままです。
  • twint:アーカイブ済みで、2020 年からリリースがありません。
  • twikit:最後のリリースは 2025 年 2 月で、2026 年の不具合の修正は取り込まれていません。
  • twscrape:保守されていますが、README に認証済みのアカウントが要ると書かれています。

動くものは、アカウントのセッション Cookie でログインします。そのアカウントがリスクを負い、X が Web アプリを変えるたびにコードが壊れます。

自分のポストだけなら、スクレイピングは要りません。X のヘルプセンターによると、[設定とプライバシー]の[アカウント]からアーカイブを申請でき、届くまで数日かかることがあります。

従量課金の API は、X への接続を代わりに受け持ち、結果の件数で請求します。私たちの Weir の Twitter スクレイパー API(英語)もその 1 つです。読み取り専用で、毎月 5,000 クレジットが無料です。以下の手順はこの方法を使います。

ステップ 1:キーを取得して Python で 1 回検索する

カードなしで 登録(英語)し、キーを作って環境変数に入れます。

export WEIR_API_KEY="weir_live_..."

scrape_x.py を作り、リクエストを送る関数を書きます。標準ライブラリだけなので、pip が使えない AI エージェントのサンドボックスでも動きます。

import csv, json, os, time, urllib.error, urllib.request
URL = "https://api.weirapp.io/v1/x/search"
HEADERS = {"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}",
           "Content-Type": "application/json"}

def fetch_page(body):
    request = urllib.request.Request(URL, json.dumps(body).encode(), HEADERS, method="POST")
    try:
        with urllib.request.urlopen(request, timeout=60) as response:
            return json.load(response)
    except urllib.error.HTTPError as error:
        if error.code != 429:  # 402 はクレジット切れ。再試行しない
            raise
        time.sleep(int(error.headers.get("Retry-After", "5")))
        return fetch_page(body)  # レート制限:待ってから送り直す

ステップ 2:集める条件を決める

検索の条件を足します。query か fromUsers など、検索の項目が 1 つは必要です。

BODY = {
    "query": "MMX",                         # すべて含む語
    "fromUsers": ["JAXA_jp"],               # 任意:このアカウントだけ
    "since": "2026-10-01T00:00:00+09:00",   # 日本時間で書ける
    "until": "2026-10-25T00:00:00+09:00",   # この時刻の直前まで
    "minLikes": 100,                        # X 自身のフィルター、目安
    "language": "ja",
    "sort": "latest",                       # または "top"
    "limit": 20,                            # X は 1 ページ約 20 件
}

minLikes は X 自身の数え方なので、少し下回るポストが返ることがあります。厳密に絞るなら、likeCount を自分でも確かめます。

ステップ 3:nextCursor が null になるまでページを送る

meta.nextCursor をそのまま送り返し、null になったときだけ止めます。

def search_pages(body, max_pages=10):
    cursor = None
    for _ in range(max_pages):  # 呼び出し回数、つまり費用の上限
        page = fetch_page({**body, "cursor": cursor} if cursor else body)
        yield from page["data"]
        cursor = page["meta"].get("nextCursor")
        if not cursor:  # null だけが終わりの合図
            return

空のページが返っても、続きがあることがあります。最後は 1 クレジットの空のページで null が返るのが普通です。

ステップ 4:ツイートを CSV に保存する

最後に CSV に書き出し、python scrape_x.py で実行します。utf-8-sig にすると、Excel で開いても日本語が文字化けしません。

FIELDS = ["id", "createdAt", "username", "text", "likeCount",
          "retweetCount", "replyCount", "viewCount", "url"]

with open("posts.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.DictWriter(file, fieldnames=FIELDS, extrasaction="ignore")
    writer.writeheader()
    for post in search_pages(BODY, max_pages=10):
        writer.writerow({**post, "username": post["author"]["username"]})

10 月 26 日に、同じ条件を Weir の MCP の search_x で limit: 5 にして実行しました。2 ページで 10 件が返り、1 ページ 6 クレジットでした。1 件目の抜粋です。

{
  "id": "2113178965523505222",
  "text": "10月20日、種子島宇宙センターより、H3ロケット10号機による火星衛星探査機(MMX)の打上げを行いました。…",
  "createdAt": "2026-10-22T08:01:41.000Z",
  "author": { "username": "JAXA_jp" },
  "likeCount": 3060,
  "retweetCount": 555,
  "viewCount": 81515
}

id は文字列のまま扱います。X の ID は長く、Excel の数値にすると末尾が崩れます。

Twitter スクレイピングの費用はいくら?

検索 1 回が 1 クレジットで、ポスト 1 件ごとに 1 クレジットです。1 ページは約 20 件です。

  • ある話題の 1,000 件:50 回の呼び出しで、1,050 クレジットです。
  • 1 アカウントの毎日の取得:新着 20 件までなら約 22 クレジットです。
  • 卒論の 50,000 件:約 52,500 クレジットです。

毎月の無料 5,000 クレジットで、約 4,700 件読めます。50,000 件の場合です。

50,000 件を読む費用(2026 年 10 月)
X API$250
Weir、$20 パック約 $8.75

$20(米ドル)のパックは 120,000 クレジットで、期限はありません。

Twitter のスクレイピングは規約違反?

これは法的な助言ではありません。ここでは X の規約に書かれていることだけを紹介します。

X の規約は禁止しています。 2026 年 10 月 9 日発効の版は、事前の書面の同意なく「いかなる形でも、いかなる目的でも」クロールやスクレイピングをすることを明確に禁じています。

規約に違反して 1 日に 100 万件を超えるポストを要求すると、100 万件ごとに $15,000 の損害賠償を定めています。

Weir が向かないケース

  • 投稿や返信をしたい:Weir は読み取り専用です。書き込みは X の API でできます。
  • X 自身の許可が必要:Weir は X の公認ではないので、使える範囲が変わることがあります。
  • 1 件の単価を最安にしたい:TwitterAPI.io は 1,000 ツイート $0.15 で、小さなパックより安いです。
  • 自分のポストだけほしい:アーカイブは無料です。

うまく動かないときは

  • KeyError か 401:このシェルにキーが入っていないか、キーが無効です。
  • 2 ページ目で 400:条件を変えました。カーソルは元のリクエストでしか使えません。
  • CSV が空:minLikes を外すか、期間を広げます。

よくある質問

Twitter を無料でスクレイピングできますか?

一部はできます。OSS ライブラリはお金はかかりませんが、ログインしたアカウントを危険にさらします。自分のアーカイブは無料です。Weir の無料枠は毎月 5,000 クレジットで約 4,700 件読め、カードは要りません。

snscrape は 2026 年も使えますか?

使えません。Twitter の取得は 2023 年 6 月から「blocked (404)」で失敗し、修正版も出ていません。twscrape は保守されていますが、ログイン済みのアカウントが要ります。

Selenium や BeautifulSoup で取得してもいいですか?

X の規約は、書面の同意がないスクレイピングを「いかなる形でも」禁じています。文言は、使う道具や方法を限っていません。ブラウザ操作で取得する手順は、この記事では扱いません。

API もアカウントもなしで取得できますか?

自力では安定しません。ログインなしで使えた snscrape は、2023 年 6 月から失敗しています。外部の API なら、必要なのはそのキーだけです。

参考資料