---
title: "Python으로 Twitter(X) 스크레이핑: 트윗, 팔로워 수집과 CSV 내보내기"
description: "Python 튜토리얼: TwexAPI REST API로 X(Twitter)의 공개 트윗과 팔로워를 수집하고, 페이지를 넘기며 CSV로 저장합니다. 브라우저, 프록시, X 계정이 필요 없습니다."
---

이 가이드는 Python에서 일반 HTTP 요청만으로 X(Twitter)의 공개 데이터를 수집합니다. 고급 검색 연산자로 트윗을 검색하고, 결과 페이지를 넘기고, 팔로워 목록을 내보내 모두 CSV로 저장합니다. 헤드리스 브라우저, 프록시, X 계정 없이 TwexAPI API 키만 있으면 됩니다.

## 준비

1. [twexapi.io](https://twexapi.io/get-started)에서 계정을 만들면 무료 20,000 크레딧(약 4,000건 읽기)을 받습니다.
2. 대시보드에서 API 키를 복사해 환경 변수로 설정합니다.

```bash
export TWEXAPI_KEY="twexapi_xxx"
pip install requests
```

## 트윗 검색

[고급 검색 엔드포인트](/ko/api-reference/search-endpoints/get-data-page-twitter-advanced-search-page-post)는 `searchTerms`(검색어 목록), `sortBy`(`Latest` 또는 `Top`), 페이지 이동용 `next_cursor`를 받습니다. 한 페이지에 최대 20개의 트윗이 반환됩니다.

```python
import os
import time

import requests

API = "https://api.twexapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['TWEXAPI_KEY']}"}


def paginate(path, body, max_items):
    """POST a cursor endpoint until max_items rows or the last page."""
    items, cursor = [], ""
    while len(items) < max_items:
        res = requests.post(f"{API}{path}", headers=HEADERS, json={**body, "next_cursor": cursor}, timeout=30)
        res.raise_for_status()
        page = res.json()
        items += [row for row in page.get("data", []) if row]
        cursor = page.get("next_cursor")
        if not page.get("has_next_page") or not cursor:
            break
        time.sleep(5)  # free Starter plan: 1 request per 5 seconds; paid plans allow 5+ per second
    return items[:max_items]


tweets = paginate(
    "/twitter/advanced_search/page",
    {"searchTerms": ["openai", "lang:en", "min_faves:100", "since:2026-10-01"], "sortBy": "Latest"},
    max_items=200,
)
print(len(tweets), "tweets")
```

`searchTerms`에는 X 검색창과 같은 연산자를 쓸 수 있습니다.

| 연산자 | 예시 | 의미 |
| :--- | :--- | :--- |
| `from:` | `from:nasa` | 특정 계정의 게시물 |
| `since:` / `until:` | `since:2026-10-01` | 기간 |
| `lang:` | `lang:ko` | 언어 |
| `min_faves:` | `min_faves:100` | 최소 좋아요 수 |
| `-filter:replies` | | 답글 제외 |

## CSV로 저장

```python
import csv

with open("tweets.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["tweet_id", "created_at", "user", "likes", "retweets", "text"])
    for t in tweets:
        writer.writerow([
            t.get("tweet_id"),
            t.get("created_at"),
            (t.get("user") or {}).get("screen_name"),
            t.get("favorite_count"),
            t.get("retweet_count"),
            (t.get("text") or "").replace("\n", " "),
        ])
```

`utf-8-sig`로 저장하면 Excel에서 열어도 한글과 이모지가 깨지지 않습니다.

## 팔로워 수집

[팔로워 엔드포인트](/ko/api-reference/followers-following-endpoints/get-followers-cursor-apiendpoint-twitter-followers-page-post)도 같은 커서 방식이라 `paginate` 함수를 그대로 쓸 수 있습니다.

```python
followers = paginate("/twitter/followers/page", {"screen_name": "nasa"}, max_items=1000)

with open("followers.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["username", "name", "followers", "location", "bio"])
    for u in followers:
        writer.writerow([u.get("username"), u.get("name"), u.get("followersCount"), u.get("location"), u.get("description")])
```

## 비용

일반적인 읽기는 1건에 5 크레딧, 트윗이나 팔로워 1,000건당 약 $0.05입니다. 위 예시(트윗 200건과 팔로워 1,000건)는 합계 약 $0.06입니다. 정확한 단가는 [요금 안내](/ko/guides/pricing)를 참고하세요.

## Selenium, Playwright, twscrape를 쓰지 않는 이유

X가 2024년 초 게스트 접근을 종료한 뒤로 브라우저 기반 및 오픈소스 스크레이퍼는 로그인된 X 계정과 프록시가 필요하고, X가 사이트를 바꿀 때마다 깨집니다. API를 쓰면 이런 유지보수를 직접 하지 않아도 됩니다. 자세한 비교는 [자체 Twitter 스크레이퍼 vs TwexAPI](/ko/comparison/scraper-vs-api)를 참고하세요.

## 다음 단계

- [Twitter 스크레이퍼 API 개요](https://twexapi.io/twitter-scraper): 수집할 수 있는 데이터와 Apify, 공식 API와의 비교.
- [오류 처리](/ko/guides/error-handling): `429`와 `5xx` 응답 시 재시도와 백오프.
- 공개 데이터만 수집하고, 개인정보 관련 법규와 X 약관을 지키세요.
