Twitter スクレイピングを Python で行う方法 2026
Twitter(X)のスクレイピングを Python で行う 4 つの方法と費用、弱点を比較。標準ライブラリだけで検索結果を CSV に保存するスクリプトと、X の規約の要点まで。
Tarun Khatri
公開 · 更新 · 約 7 分で読めます · Read in English · 阅读中文版
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}'
- キーを取得カードなしで登録し、環境変数に入れます。
- 条件を決める語句、アカウント、期間、言語を指定します。
- ページを送るnextCursor が null になるまで続けます。
- 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 日に確認した料金ページの値です。
「月 $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 件の場合です。
$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 なら、必要なのはそのキーだけです。
参考資料
- X API pricing(英語、10 月 26 日に確認):https://docs.x.com/x-api/getting-started/pricing
- X Terms of Service(英語、10 月 9 日発効、Wayback の 10 月 17 日版):https://web.archive.org/web/20261017135543/https://x.com/en/tos
- X Help Center, downloading your archive(英語、Wayback の 10 月 15 日版):https://web.archive.org/web/20261015124209/https://help.x.com/en/managing-your-account/how-to-download-your-x-archive
- snscrape issue #996(英語、10 月 25 日に確認):https://github.com/JustAnotherArchivist/snscrape/issues/996
- twint(英語、アーカイブ済み):https://github.com/twintproject/twint
- twikit(英語、10 月 25 日に確認):https://github.com/d60/twikit
- twscrape README(英語、10 月 25 日に確認):https://github.com/vladkens/twscrape
- TwitterAPI.io pricing(英語、10 月 26 日に確認):https://twitterapi.io/pricing
- Weir billing(英語):https://docs.weirapp.io/billing
- Weir 経由の @JAXA_jp の検索(10 月 26 日、2 ページで 12 クレジット)