여러 request에서 proxy 재사용
후속 request 전반에서 동일한 proxy 출구를 유지하여 JavaScript 렌더링, API 호출 및 페이지네이션 fetch가 모두 동일한 IP에서 발생하도록 설정하는 방법을 알아봅니다.
Proxy 재사용 이유
대상에 처음 접근할 때 FourA가 작동하는 proxy를 자동으로 선택합니다. 모든 response에는 사용된 proxy ID가 포함됩니다. 이후 request에 해당 ID를 다시 전달하면 다음과 같은 이점이 있습니다.
- 후속 페이지가 동일한 출구를 통해 전달되므로 세션 cookie 및 rate limit이 대상에 일관되게 유지됩니다.
- 국가 범위 fetch가 새 선택 없이 허용 목록 내에 유지됩니다.
- 저렴한
POST /api/single/endpoint는 Proxy 비용 대신 Single 비용으로 이미 검색 비용을 지불한 proxy를 통해 재생합니다.
proxy ID는 불투명한 base36 문자열(예: A1B2C3)이며, 원시 IP가 아닙니다.
Response 내 ID 위치
| Endpoint | Field | 표시 조건 |
|---|---|---|
POST /api/auto/ |
session.proxy |
returnSession 값이 true(기본값)일 때 |
POST /api/single/ |
proxy (최상위) |
request에 proxy field가 제공된 경우에만 |
POST /api/proxy/ |
proxy (최상위) |
항상(성공 시) |
POST /api/browser/ |
proxy (최상위) |
request에 proxy field가 제공된 경우에만 |
proxy를 고정하지 않고 새 출구를 가져오려면 Auto 또는 Proxy로 시작하십시오. 두 방식 모두 작동하는 출구를 찾아 해당 ID를 반환합니다.
패턴 1: Auto 검색, Single 재생
아직 파악되지 않은 대상을 처리할 때 가장 적합합니다. Auto가 단계를 한 번 탐색한 후, Single이 모든 후속 페이지에 성공한 세션을 재사용합니다.
import requests
API = "https://eu.api.foura.ai"
H = {"X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json"}
# Step 1: discover a working exit with Auto.
r = requests.post(f"{API}/api/auto/", headers=H, json={
"url": "https://example.com/product/42",
"validate": {"data": {"accept": ["Add to cart"]}}
}).json()
session = r["session"]
proxy = session["proxy"]
user_agent = session["userAgent"]
# Step 2: paginate with Single, reusing the same exit and User-Agent.
for sku in ("43", "44", "45"):
p = requests.post(f"{API}/api/single/", headers=H, json={
"method": "GET",
"url": f"https://example.com/product/{sku}",
"proxy": proxy,
"headers": [["User-Agent", user_agent]],
}).json()
print(sku, p["status"])
Auto 호출 비용은 해당 래더가 소비한 양에 따라 결정됩니다. 이후의 모든 후속 Single 호출에는 2 크레딧이 소모됩니다(기본값인 unblocker 포함 Single).
패턴 2: Proxy가 탐색하고 Browser가 동일한 출구를 통해 렌더링
타겟이 특정 출구 국가를 확인해야 하고 최종 콘텐츠에 JavaScript가 필요한 경우에 사용합니다.
# Step 1: pick a country-scoped exit with Proxy.
curl -X POST https://eu.api.foura.ai/api/proxy/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"maxTries": 5,
"exitCountries": ["FR", "GB"],
"request": {"method": "GET", "url": "https://example.com/pricing"}
}'
# Response includes: "proxy": "A1B2C3", "exitCountry": "FR"
# Step 2: render the JS-heavy page through THAT exit.
curl -X POST https://eu.api.foura.ai/api/browser/ \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/pricing",
"proxy": "A1B2C3",
"timeout_ms": 20000
}'
선택을 갱신하기 위해 /api/proxy/를 다시 호출하지 마십시오. 새로운 호출은 다른 exit를 선택하여 고정(pinning)의 목적을 무효화할 수 있습니다. 고정된 exit가 작동을 멈추면 새로운 /api/proxy/ 호출을 실행하여 새 exit를 선택한 후 해당 exit로 계속 진행하십시오.
패턴 3: 차단된 exit 건너뛰기
이전에 작동하던 exit가 거부 응답이나 인증 페이지를 반환하기 시작하면 다음 선택 시 FourA가 해당 exit를 제외하도록 지정하십시오.
{
"maxTries": 5,
"ignoreProxies": ["A1B2C3"],
"request": { "method": "GET", "url": "https://example.com/data" }
}
ignoreProxies는 이전 response의 proxy ID 목록을 허용합니다. /api/proxy/ 및 /api/auto/에서 작동합니다. 이 목록은 모든 내부 재시도에서 적용되므로, ignoreProxies를 사용한 단일 호출은 차단된 exit 노드를 절대 선택하지 않습니다.
고정 세션 유지 시간
exit 자체는 기본 proxy가 정상 상태인 동안 유지되며, 일반적으로 몇 분에서 몇 시간 동안 지속됩니다. 재요청 시 챌린지, 차단 또는 예기치 않은 리디렉션이 반환되기 시작하면 exit가 교체되었거나 대상 사이트가 clearance를 갱신했을 가능성이 높습니다.
해당 상황 발생 시 두 가지 옵션:
- 동일한 URL로 새로운
/api/auto/호출을 수행합니다. Auto가 작동하는 새 세션을 탐색하며 이전 ID는 폐기합니다. - 수동 고정을 계속 유지하려면
ignoreProxies: ["<burned-id>"]와 함께 새로운/api/proxy/호출을 수행합니다.
Auto response의 세션 cookie 역시 대상 사이트의 자체 일정에 따라 만료됩니다. 일부 사이트는 clearance를 몇 시간 동안 유지하지만, 다른 사이트는 몇 분만 유지합니다. 세션을 영구 토큰이 아닌 캐시로 취급하십시오.
ID 고정이 실패하는 경우
proxy 값에서 세 가지 400 에러가 반환될 수 있으며, 각각 다른 원인을 나타냅니다:
| Error | 원인 | 해결 방법 |
|---|---|---|
Invalid proxy format |
FourA가 발급한 ID 값이 아닙니다. 원시 proxy 주소를 전달하면 이 오류가 발생합니다. | response로 받은 불투명 문자열을 그대로 전송하십시오. |
Proxy not found |
ID가 디코딩되었지만 더 이상 활성 exit로 확인되지 않습니다. | 새로운 Auto 또는 Proxy 호출을 통해 새 exit를 가져오십시오. |
Managed exit: this proxy id cannot be pinned to a request |
해당 ID는 프리미엄 exit이며, 현재 기간의 플랜 프리미엄 트래픽이 모두 소진되었거나 플랜에 프리미엄 exit가 포함되어 있지 않습니다. | POST /api/proxy/를 통해 호출을 실행하여 선택된 exit를 사용하거나, 프리미엄 트래픽을 추가한 후 다시 고정하십시오. |
세 번째 에러는 성공한 호출에서 전달받은 ID에서도 반환될 수 있으므로, 잘못된 요청을 하지 않았더라도 발생할 수 있습니다. 만료된 세션을 처리하는 방식과 동일하게 동일한 ID를 재시도하지 말고 새로운 탐색 호출로 fallback하십시오.
흔히 발생하는 실수
- 계정 간 proxy ID 재사용. 계정 간에 ID를 공유하지 마세요. 한 계정에서 고정할 수 있는 ID라도 다른 계정에서는 거부될 수 있습니다(예: 프리미엄 트래픽이 포함되지 않은 플랜에서의 프리미엄 출구 노드).
- ID 디코딩 시도. base36 문자열은 불투명(opaque)합니다. 파싱하거나 문자를 제거하거나 소문자로 변환하지 마세요. 그대로 다시 전달하세요.
- rate limit가 적용된 출구 노드에 고정. 대상 사이트가 IP당 rate limit를 적용하는 경우 단일 출구 노드로 많은 요청을 집중시키면 차단이 더 빨리 발생합니다. 대규모 워크로드의 경우 Auto 또는 Proxy가 여러 출구 노드를 순환하도록 두고, 대상 사이트에서 반드시 필요한 경우에만 고정하세요.
- 의도치 않은 프리미엄 출구 노드 고정. 프리미엄 출구 노드가 처리한 호출(Proxy의
exitClass: "premium")에서 가져온 ID는 해당 프리미엄 출구 노드를 고정합니다. 이를 통한 모든 재생(replay)은 프리미엄 트래픽 사용량에 반영되며, 응답에X-FourA-Exit-Class: premium가 포함됩니다. - 위치 타겟팅이 없는 플랜에서
exitCountries전송. 국가 타겟팅 범위 설정은 Startup 플랜 이상부터 포함됩니다. 해당 기능이 없는 플랜에서exitCountries를 전송하는 호출은403및X-FourA-Limit: plan_limit_feature와 함께 거부됩니다. - 후속 요청에서
exitCountries생략. 범위가 지정된 출구 노드를 고정한 후exitCountries없이 Proxy를 다시 호출하면 후속 요청이 다른 국가를 통해 전달될 수 있습니다. 필요한 모든 호출에 범위를 계속 유지하세요.
Related
- API Endpoints: 전체 파라미터 및 응답 레퍼런스
- Smart Fetch (Auto): Auto가 재생할 세션을 구축하는 방법
- Protected sites: 고정이 유용한 경우와 순환이 더 나은 경우
- Common Issues:
no_eligible_proxy및 기타 proxy 오류 - Why a Proxy Request Ran Out of Tries: Proxy 호출이 중단되었을 때
attemptReport읽기