# Python에서 IP 회전이 가능한 모바일 프록시 사용법

> 4G/5G 모바일 프록시용 Python 코드: HTTP 또는 SOCKS5를 통한 requests 및 httpx, API를 통한 IP 회전, 429 제한 처리, 고정 세션. KYC 없이.

- URL: https://cellmast.com/ko/guides/python-mobile-proxy/
- 마지막 업데이트: 2026-10-13
- Publisher: CellMast (https://cellmast.com)

CellMast 전용 포트 또는 회전 모바일 풀용 복사 가능 Python 코드: 연결, 회전, 새 주소 대기, API 과부하 없이 재시도.

**빠른 답변 — Python에서 IP 회전과 함께 모바일 프록시는 어떻게 사용하나요?**

프록시 URL `http://USERNAME:PASSWORD@gw.cellmast.com:7777`을 `requests` 또는 `httpx`에 전달하고 새 캐리어 IP가 필요할 때 API 키와 함께 `POST /api/v1/mobile/{portId}/rotate`을 호출하세요. 응답은 보통 5~15초 걸리며 회전 간 30초 간격을 지켜야 합니다. **CellMast** 전용 4G/5G 포트는 일일 $2.63부터 시작, KYC 없이, 암호화폐로 결제 가능.

## 필요한 것

| 속성 | 값 |
| --- | --- |
| Python | 3.10 이상 |
| 라이브러리 | `requests` (HTTP), SOCKS5용 `requests[socks]` 또는 `httpx[socks]` |
| 게이트웨이 | `gw.cellmast.com`, HTTP 포트 7777, SOCKS5 포트 7778 |
| 포트 자격 증명 | 클라이언트 영역에서 받은 사용자 이름과 비밀번호; 지원 팀이 포트를 이동하면 호스트, 포트, 비밀번호가 바뀔 수 있으니 클라이언트 영역에서 다시 확인하세요. |
| API 키 | 회전을 위한 `proxies` 범위 포함 |
| 회전 풀 사용자 이름 | `USERNAME-country-{cc}-session-{id}-ttl-{minutes}` |

## 모바일 포트를 통해 요청을 보내려면 어떻게 해야 하나요?

`http`와 `https`에 동일한 프록시 URL을 설정하세요. HTTPS 대상의 경우 `requests`가 게이트웨이를 통해 CONNECT 터널을 열어 대상이 캐리어 IP를 볼 수 있으며 TLS는 종단 간(end to end)으로 유지됩니다.

*HTTP를 통한 요청*

```python
import requests

PROXY = "http://USERNAME:PASSWORD@gw.cellmast.com:7777"
proxies = {"http": PROXY, "https": PROXY}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json())  # {'ip': '<carrier IP>'}
```

*SOCKS5 (pip install "requests[socks]")*

```python
import requests

# socks5h: the proxy resolves the hostname, not your machine
PROXY = "socks5h://USERNAME:PASSWORD@gw.cellmast.com:7778"
r = requests.get("https://api.ipify.org", proxies={"http": PROXY, "https": PROXY}, timeout=30)
print(r.text)
```

## Python에서 IP를 회전하려면 어떻게 해야 하나요?

429 응답을 이해하는 헬퍼 안에 회전 호출을 감싸세요. 아래 헬퍼는 너무 빨리 회전할 경우 `Retry-After` 만큼 기다린 후 캐리어가 실제로 새 주소를 제공했는지 확인합니다.

*회전 헬퍼*

```python
import time
import requests

API = "https://cellmast.com/api/v1"
KEY = "API_KEY"

def rotate(port_id: str, tries: int = 3) -> str:
    """Ask the modem for a new carrier IP and return it."""
    for _ in range(tries):
        r = requests.post(f"{API}/mobile/{port_id}/rotate",
                          headers={"Authorization": f"Bearer {KEY}"}, timeout=60)
        if r.status_code == 429:  # rotation_too_soon
            time.sleep(int(r.headers.get("Retry-After", "30")))
            continue
        r.raise_for_status()
        data = r.json()
        if data["ip"] != data.get("previousIp"):
            return data["ip"]
        time.sleep(30)  # same IP from the carrier: wait and try again
    raise RuntimeError("no new IP after several tries")

print("new IP:", rotate("PORT_ID"))
```

## 작업 중간이 아니라 작업 사이에서 IP를 회전하려면?

하나의 작업을 하나의 주소에서 실행한 후 다음 작업 전에 회전하세요. 이렇게 하면 작업 내에서는 쿠키와 로그인 상태가 일관되고 각 작업에 새 IP가 주어집니다.

*작업당 하나의 IP*

```python
import requests

PROXY = "http://USERNAME:PASSWORD@gw.cellmast.com:7777"

def run_job(urls):
    with requests.Session() as s:
        s.proxies = {"http": PROXY, "https": PROXY}
        for url in urls:
            resp = s.get(url, timeout=30)
            print(resp.status_code, url)

jobs = [["https://example.com/a", "https://example.com/b"],
        ["https://example.com/c"]]
for urls in jobs:
    run_job(urls)
    rotate("PORT_ID")  # helper from the previous example
```

## httpx에서 스티키 세션과 함께 회전 풀을 사용하려면?

GB 단위 풀에는 회전 호출이 없습니다: 사용자 이름이 결정합니다. 세션 ID가 없으면 각 새 연결마다 새 IP가 할당됩니다. HTTP 클라이언트는 연결을 유지(keep-alive)하므로 요청당 새 IP를 원하면 각 요청마다 새 클라이언트를 열거나 `Connection: close`를 보내세요. `session-<id>-ttl-<minutes>`를 사용하면 요청이 해당 시간 동안 하나의 IP를 유지합니다.

*httpx (pip install httpx)*

```python
import uuid
import httpx

def pool_client(country: str = "us", minutes: int | None = None) -> httpx.Client:
    user = f"USERNAME-country-{country}"
    if minutes:
        user += f"-session-{uuid.uuid4().hex[:8]}-ttl-{minutes}"
    proxy = f"http://{user}:PASSWORD@gw.cellmast.com:7777"
    return httpx.Client(proxy=proxy, timeout=30)

with pool_client("gb", minutes=10) as c:   # same UK mobile IP for 10 minutes
    print(c.get("https://api.ipify.org").text)
    print(c.get("https://api.ipify.org").text)
```

## 내 스크립트가 어떤 오류를 처리해야 하나요?

- **회전 API에서 HTTP 429:** 30초도 안 되어 회전했음. `Retry-After` 만큼 기다리세요.
- **HTTP 409 `port_not_active`:** 포트가 만료되었거나 정지됨. 클라이언트 영역에서 확인하세요.
- **회전 직후 프록시 연결 오류:** 정상입니다; 모뎀이 재연결 중일 수 있으니 잠시 기다렸다 재시도하세요.
- **게이트웨이에서 HTTP 407:** 포트의 사용자명 또는 비밀번호가 잘못됨.
- **대상 서버가 403 또는 429 응답:** 속도를 줄인 뒤 회전 한 번 하세요. 모바일 IP는 공유되므로 느린 속도가 대부분 문제를 해결합니다.

## Python과 모바일 프록시 관련 질문

### Python에서 HTTP와 SOCKS5 중 무엇을 사용해야 하나요?

HTTP가 더 간단하며 plain `requests`에서 작동합니다. SOCKS5는 `requests[socks]`가 추가로 필요하지만 모든 TCP 트래픽을 처리하고, `socks5h://`는 DNS를 클라이언트가 아닌 프록시 쪽에서 해결합니다. 둘 다 같은 CellMast 모뎀에 도달하며 HTTP는 포트 7777, SOCKS5는 포트 7778를 사용합니다.

### asyncio를 모바일 프록시와 함께 사용할 수 있나요?

예. `httpx.AsyncClient(proxy=...)`와 `aiohttp` 모두 HTTP 프록시 URL을 허용합니다. 단일 전용 포트에서 적당한 동시성으로 유지하세요: 한 모뎀과 한 캐리어 연결이라 수십 개의 병렬 요청이 동일한 무선 링크를 공유합니다.

### Selenium이나 Playwright에서 포트를 사용하려면?

Playwright에서는 `proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"}`를 `launch()` 또는 `new_context()`에 전달하세요. Selenium 프록시 옵션에는 비밀번호가 없으며 Selenium 4 BiDi 네트워크 인증으로 프록시 로그인을 처리하거나 Playwright를 사용하세요. 페이지가 로드 중일 때는 회전하지 말고 브라우저 컨텍스트 사이에서 회전하세요.

**포트와 API 키 얻기** 일일 $2.63의 전용 4G/5G 포트, US$1.50/GB의 회전형 모바일 데이터. 암호화폐로 결제하세요. [가격 보기](https://cellmast.com/ko/pricing/) · [모바일 API 참고](https://cellmast.com/docs/api/mobile/)

---

CellMast: CellMast는 레지덴셜 프록시 제공업체입니다: 무제한 트래픽의 전용 캐리어 모뎀과 회전형 GB당 모바일 프록시 풀을 암호화폐로, KYC 없이 지급합니다.
