여러 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 필드가 제공된 경우에만 |
POST /api/proxy/ |
proxy(최상위 레벨) |
성공 시 항상 |
POST /api/browser/ |
proxy(최상위 레벨) |
request에 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가 검색하고 브라우저가 동일한 출구를 통해 렌더링
대상이 특정 출구 국가를 확인해야 하고 최종 콘텐츠에 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를 선택하여 고정 목적을 무효화할 수 있습니다. 고정된 exit가 작동을 멈추면 새로운 /api/proxy/ 호출을 실행하여 새 exit를 선택한 후 계속 진행하십시오.
패턴 3: 차단된 exit 건너뛰기
이전에 작동하던 exit가 차단 또는 CAPTCHA를 반환하기 시작하면, 다음 선택 시 해당 exit를 피하도록 FourA에 지시하십시오.
{
"maxTries": 5,
"ignoreProxies": ["A1B2C3"],
"request": { "method": "GET", "url": "https://example.com/data" }
}
ignoreProxies는 이전 응답에서 받은 proxy ID 목록을 허용합니다. /api/proxy/ 및 /api/auto/에서 작동합니다. 이 목록은 모든 내부 재시도에서 준수되므로 ignoreProxies를 사용한 단일 호출은 소진된 exit을 선택하지 않습니다.
고정된 세션의 유지 시간
exit 자체는 기반 proxy가 정상적인 한 유지되며, 일반적으로 수 분에서 수 시간입니다. 재시도 시 챌린지, 차단 또는 예상치 못한 리디렉션이 반환되기 시작하면 exit이 교체되었거나 대상이 클리어런스를 갱신했을 가능성이 높습니다.
이 경우 두 가지 옵션이 있습니다:
- 동일한 URL에 대한 새로운
/api/auto/호출. Auto가 새로운 작동 세션을 검색하며, 이전 ID는 삭제합니다. - 수동 고정을 유지하려면
ignoreProxies: ["<burned-id>"]를 사용한 새로운/api/proxy/호출.
Auto 응답의 세션 쿠키도 대상 자체 일정에 따라 만료됩니다. 어떤 사이트는 클리어런스를 수 시간 유지하지만, 다른 사이트는 수 분만 유지합니다. 세션을 영구 토큰이 아닌 캐시로 취급하십시오.
일반적인 실수
- 계정 간 proxy ID 재사용. Proxy ID는 응답별 식별자입니다. 한 API 키의 ID를 다른 키로 전달한다고 해서 동일한 exit으로 연결된다고 보장할 수 없습니다.
- ID 디코딩 시도. base36 문자열은 불투명합니다. 파싱, 문자 제거 또는 소문자 변환을 하지 마십시오. 있는 그대로 전달하십시오.
- rate limit된 exit을 통한 고정. 대상이 IP 단위로 rate limit을 적용하는 경우 단일 exit으로 다수의 요청을 보내면 더 빠르게 차단됩니다. 대규모 워크로드의 경우 Auto 또는 Proxy가 다수의 exit을 순환하도록 하고, 대상이 반드시 요구하는 경우에만 고정하십시오.
- 후속 요청에서
exitCountries무시. 범위가 지정된 exit을 고정하고exitCountries없이 Proxy를 다시 호출하면, 후속 요청이 다른 국가로 라우팅될 수 있습니다. 필요한 모든 호출에 범위를 유지하십시오.
관련 문서
- API Endpoints: 전체 파라미터 및 응답 참조
- Smart Fetch (Auto): Auto가 재시도 세션을 구성하는 방법
- Handling Anti-Bot Protection: 고정이 유리한 경우와 순환이 나은 경우
- Common Issues:
no_eligible_proxy및 기타 proxy 오류