rotate-scraping-proxies
정보
이 스킬은 클라이언트 측 은닉 기술만으로 부족할 때 웹 스크레이핑을 위한 프록시 회전 기능을 제공합니다. 데이터센터, 주거용, 모바일 프록시 풀 간 전환이 가능하며 세션 고정성과 비용 모니터링을 지원합니다. 기본 방법이 실패한 후 합법적인 스크레이핑을 위한 확장 단계로 사용하되, 윤리적 경계를 강조하는 데 활용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/rotate-scraping-proxiesClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
輪換抓取代理
抓取活動於用戶端隱身手段已盡時之網路層升級。代理輪換為最後手段,非預設——其昂貴、倫理敏感、易被濫用。此技能教人何時不應用,與如何善用,並重。
適用時機
headless-web-scraping(Fetcher → StealthyFetcher → DynamicFetcher)已試而目標仍返 403/429/地理封鎖- 速率限制已達 3 秒以上間隔,且
robots.txt允許該路徑 - User-Agent 與 TLS 指紋已寫實(非預設之
python-requests) - 抓取為合法:公開資料、無繞過驗證、無繞付費牆、無法律依據外採集個人資料
- 可為代理流量編列預算並接受運營複雜度
勿用之時機:存在公開 API(用之)、網站 ToS 禁止自動存取、繞過地理授權,或目的為詐欺/撞庫/搶鞋機器人/內容盜版。
輸入
- 必要:目標 URL 及抓取之法律依據
- 必要:代理池憑證(從環境讀取,絕不硬編碼)
- 必要:池類型——資料中心、住宅或行動
- 選擇性:地理定位(國家/區域/城市)
- 選擇性:輪換粒度——每請求(預設)或黏性會話
- 選擇性:每日流量/支出上限
- 選擇性:速率限制延遲秒數(預設:1,輪換時亦同)
步驟
步驟一:起飛前合法性與倫理檢查
整個流程以書面合法與倫理審查為閘。跳此步乃單一最大傷害源。
# Inputs to confirm before writing any code:
# 1. Is the data public (no login required)?
# 2. Does robots.txt permit the path?
# 3. Does the site's ToS prohibit automated access? (read it)
# 4. Would the scraping process personal data? If yes, what is the legal basis?
# 5. Could this access circumvent geo-licensing, paywalls, or auth?
# 6. Is there a public API or data dump that would make scraping unnecessary?
# 7. Have you contacted the site owner if scope is large?
預期: 每問皆有可辯護之書面答覆。首見「否」或「不知」即停止流程,待解決後再續。
失敗時:
- ToS 禁止自動存取——勿續;改聯繫網站擁有者,或用官方 API 或授權資料集
- 個人資料無法律依據——勿續;徵詢隱私法律顧問
- 繞過驗證或地理授權——任何情況下皆勿續
步驟二:選擇池類型
不同池類型有不同之成本、可偵測性與倫理輪廓。擇能實際解封之最便宜層級。
| 池類型 | 可偵測性 | 成本 | 最適 |
|---|---|---|---|
| 資料中心 | 高(易為 Cloudflare/Akamai 封鎖) | $ | 無真反機器人之站、僅做地理切換 |
| 住宅 | 低(真實 ISP IP) | $$$ | 封鎖資料中心 ASN 之站 |
| 行動 | 極低(電信級 NAT,與千人共用) | $$$$ | 連住宅都封之站(罕見) |
住宅與行動之倫理警告: 此類池將你之流量路由經真實消費者連線。池運營商之同意模型不一——有付費予用戶者,亦有將出口節點同意捆綁進「免費 VPN」EULA 而用戶不讀者。應優先選有審計、選入式同意之供應商。若你不願有陌生人經你家路由器送出抓取流量,便勿經他人之路由器送你之流量。
預期: 經書面決定之最便宜可行層級,並簡短說明為何拒絕更高層(或為何需更高層)。
失敗時:
- 資料中心被封而住宅超預算——升級層級前先縮抓取範圍(更少 URL、更慢節奏)
- 找不到有書面選入式同意之供應商——重新考慮抓取本身是否必要
步驟三:以 scrapling 整合輪換
將代理接入 scrapling 抓取器。從環境變數讀取憑證——絕不硬編碼,絕不將 .env 提交至 git。
import os
import random
from scrapling import Fetcher, StealthyFetcher
# Pattern A: provider-managed rotating endpoint (one URL, provider rotates per request)
PROXY_URL = os.environ["SCRAPING_PROXY_URL"] # http://user:[email protected]:7777
fetcher = StealthyFetcher()
fetcher.configure(
headless=True,
timeout=60,
network_idle=True,
proxy=PROXY_URL,
)
# Pattern B: explicit pool, rotate yourself
POOL = os.environ["SCRAPING_PROXY_POOL"].split(",") # comma-separated URLs
def fetch_with_rotation(url):
proxy = random.choice(POOL)
fetcher = StealthyFetcher()
fetcher.configure(headless=True, timeout=60, proxy=proxy)
return fetcher.get(url)
預期: 請求成功,且出口 IP 於各次呼叫間有變化。執行真實抓取前,先打 IP 回顯端點(如 https://api.ipify.org)確認。
失敗時:
- 407 Proxy Authentication Required——憑證錯,或密碼之 URL 編碼壞了(重新編碼特殊字元)
- 每次同 IP——供應商端點預設可能黏性;查文件取
-rotating或每請求旗標 - 延遲大幅增加——預期;輪換每請求加 200-2000ms
步驟四:黏性會話與池健康
依工作負載決定輪換粒度,並維持池之健康。
# Sticky session for stateful flows (login, multi-page checkout-like crawls)
# Most providers expose a session ID via the username:
# user-session-abc123:[email protected]:7777
# All requests with the same session ID exit through the same IP for ~10 min.
# Per-request rotation for anonymous bulk scraping (default)
# Pool health check — call before bulk run
def check_pool(pool, sample_size=5):
sample = random.sample(pool, min(sample_size, len(pool)))
alive = []
for proxy in sample:
try:
r = StealthyFetcher().configure(proxy=proxy, timeout=10).get(
"https://api.ipify.org"
)
if r.status == 200:
alive.append(proxy)
except Exception:
pass
return alive
# Backoff on transient proxy failures
def fetch_with_backoff(url, max_attempts=3):
for attempt in range(max_attempts):
try:
r = fetch_with_rotation(url)
if r.status not in (407, 502, 503):
return r
except Exception:
pass
time.sleep(2 ** attempt)
return None
預期: 有狀態流跨請求保持 cookies;批量匿名抓取顯示請求間 IP 變化;死代理被跳過而非循環。
失敗時:
- 登入流中途斷——輪換在會話內發生;改用黏性會話憑證
- 抽樣中所有代理皆健康檢查失敗——池耗盡或憑證過期;輪換憑證或聯繫供應商
步驟五:監控、成本控制與緊急開關
代理流量有每 GB 與每請求之成本。失控之抓取器產生失控之發票。應始終納入限額與中止機制。
import time
class ScrapeBudget:
def __init__(self, max_requests, max_duration_seconds, max_failures):
self.max_requests = max_requests
self.max_duration = max_duration_seconds
self.max_failures = max_failures
self.requests = 0
self.failures = 0
self.start = time.monotonic()
def allow(self):
if self.requests >= self.max_requests:
return False, "request cap reached"
if time.monotonic() - self.start >= self.max_duration:
return False, "time cap reached"
if self.failures >= self.max_failures:
return False, "failure cap reached (circuit breaker)"
return True, None
def record(self, success):
self.requests += 1
if not success:
self.failures += 1
budget = ScrapeBudget(max_requests=1000, max_duration_seconds=3600, max_failures=20)
for url in target_urls:
ok, reason = budget.allow()
if not ok:
print(f"Aborting: {reason}")
break
response = fetch_with_backoff(url)
budget.record(success=response is not None)
time.sleep(1) # rate limiting still applies even with rotation
預期: 預算上限於失控成本前觸發。日誌顯示每代理之成功率,俾以識別並排除壞之出口 IP。
失敗時:
- 失敗率攀升超 20%——暫停;網站已偵測輪換模式(如所有 IP 同子網);切換池類型或停止
- 每記錄成本超預期 5 倍——積極快取、URL 去重、可批處理時批處理
驗證
- 步驟一之合法性檢查於任何代碼執行前已書面記錄
- 受追蹤檔案中無代理憑證、池 URL 或會話 ID(grep
gateway.、proxy=、供應商主機名) -
.env(或等效)已在.gitignore中 - 池選擇有理:最便宜可行層級,住宅/行動已驗證同意模型
- 真實執行前已對回顯端點確認 IP 變化
- 有狀態流用黏性會話;批量匿名用每請求
- 預算上限(請求、時長、失敗)已接線並測試
- 速率限制(≥1 秒)已保留——輪換非氾濫之藉口
-
robots.txt仍受尊重——輪換不可凌駕之
常見陷阱
- 隱身未盡即輪換:網站常非需新 IP——其需寫實 User-Agent、TLS 指紋與更慢節奏。應先試
StealthyFetcher與速率限制;輪換昂貴且不必要時部署不道德。 - 硬編碼憑證:將代理 URL 貼入源檔將其洩漏至 git、容器映像與堆疊追蹤。應從環境變數或秘密管理器讀取。
- 會話中途輪換:每請求輪換打斷任何依 cookies、CSRF token 或購物車狀態之流。對有狀態工作用黏性會話。
- 將輪換視為「倫理匿名」:輪換對目標隱藏你,但不令有害抓取變道德。ToS、版權、隱私法、速率限制倫理仍不變適用。
- 以住宅代理作高風險活動:撞庫、搶鞋機器人、地理盜版串流內容、詐欺——明確不在此技能範圍。若你之用例如此,止之。
- 以「我們有輪換了」為由忽視
robots.txt:輪換不予許可。指令即指令。 - 無緊急開關:無監控之迴圈於計量代理池上一夜變成四位數發票。應始終限制請求、時長與失敗。
- 選擇同意不透明之住宅池:有些供應商從真實用戶從未讀之「免費 VPN」EULA 取得出口節點。應付溢價以取得審計、選入式之同意模型。
相關技能
- headless-web-scraping — 父技能;應始終從之起步。此技能僅作升級用。
- use-graphql-api — 存在官方 API 時,優先用之而非抓取。
- deploy-searxng — 自託管搜尋完全免於抓取搜尋引擎。
- configure-reverse-proxy — 反向之網路方向(提供而非擷取),有用之鄰參考。
- security-audit-codebase — 整合憑證後執行以確認無洩漏入倉庫。
GitHub 저장소
연관 스킬
qmd
개발qmd는 BM25, 벡터 임베딩, 재순위화를 결합한 하이브리드 검색을 통해 로컬 파일을 색인화하고 검색할 수 있는 로컬 검색 및 색인화 CLI 도구입니다. 명령줄 사용과 Claude 통합을 위한 MCP(Model Context Protocol) 모드를 모두 지원합니다. 이 도구는 임베딩에 Ollama를 사용하고 색인을 로컬에 저장하여 터미널에서 직접 문서나 코드베이스를 검색하는 데 이상적입니다.
subagent-driven-development
개발이 스킬은 각 독립적인 작업마다 새로운 하위 에이전트를 배치하고 작업 사이에 코드 리뷰를 진행하여 구현 계획을 실행합니다. 이 리뷰 프로세스를 통해 품질 게이트를 유지하면서 빠른 반복 작업을 가능하게 합니다. 동일한 세션 내에서 대부분 독립적인 작업을 진행할 때 내장된 품질 검증과 함께 지속적인 진행을 보장하기 위해 사용하세요.
mcporter
개발mcporter 스킬은 개발자가 Claude에서 직접 Model Context Protocol(MCP) 서버를 관리하고 호출할 수 있도록 합니다. 이 스킬은 사용 가능한 서버를 나열하고, 인수를 사용해 해당 서버의 도구를 호출하며, 인증 및 데몬 생명주기를 처리하는 명령어를 제공합니다. 개발 워크플로우에서 MCP 서버 기능을 통합하고 테스트할 때 이 스킬을 사용하세요.
adk-deployment-specialist
개발이 스킬은 A2A 프로토콜을 사용하여 Vertex AI ADK 에이전트를 배포하고 오케스트레이션하며, AgentCard 검색, 작업 제출, 코드 실행 샌드박스 및 메모리 뱅크와 같은 지원 도구를 관리합니다. Python, Java 또는 Go 언어로 순차, 병렬 또는 루프 오케스트레이션 패턴을 갖춘 다중 에이전트 시스템 구축을 가능하게 합니다. Google Cloud에서 ADK 에이전트 배포 또는 에이전트 워크플로우 오케스트레이션을 요청받았을 때 사용하세요.
