MCP HubMCP Hub
스킬 목록으로 돌아가기

rotate-scraping-proxies

pjt222
업데이트됨 2 days ago
2 조회
17
2
17
GitHub에서 보기
개발aiapidata

정보

이 스킬은 표준 스텔스 기법이 실패할 때 웹 스크래핑을 위한 프록시 순환을 제공하며, 데이터센터, 주거용, 모바일 프록시 풀 간 전환을 가능하게 합니다. 스크래핑 도구 통합, 구성 가능한 세션 고정, 비용 모니터링 기능을 지원합니다. 클라이언트 측 방법이 불충분할 때 합법적인 트래픽을 위한 확장 조치로 활용하세요.

빠른 설치

Claude Code

추천
기본
npx skills add pjt222/agent-almanac -a claude-code
플러그인 명령대체
/plugin add https://github.com/pjt222/agent-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/rotate-scraping-proxies

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

輪轉爬蟲代理

爬蟲被阻而客戶端隱身已盡,乃以網層之代理輪轉升而圖之。輪轉者,末路之計,非默用也——其費高、其德有疵、易為惡用。此技教其用之時,與其善用之法。

用時

  • headless-web-scraping(Fetcher → StealthyFetcher → DynamicFetcher)已試,目標仍返 403/429/地阻乃用
  • 速限已至三秒以上,且 robots.txt 許其徑乃用
  • User-Agent 與 TLS 指紋已合實(非默之 python-requests)乃用
  • 爬之合法:公開之數、無越權、無越牆、無無據而採人之數乃用
  • 可預其代理之費,能受其運之繁乃用

勿用之時:有公 API(用之)、站之 ToS 禁自動之訪、欲越地之授、欲行詐/憑據塞/球鞋搶/盜版者。

  • 必要:目標網址與爬之之法依
  • 必要:代理池之憑據(自環境讀,勿硬編)
  • 必要:池之類——數據中心、住宅、或行動
  • 可選:地之鎖(國/區/市)
  • 可選:輪轉之粒度——每請(默)或粘性會話
  • 可選:日流量/支出之限
  • 可選:速限之延(默: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 中,用者未嘗讀也。宜擇有審計、明選之同意之供者。若汝不願陌人由汝家路由送其爬流,則勿令汝之流經他人之路由。

得:書面之擇——可行之最廉等,附簡注述高等何以拒(或何以需高等)。

敗則:

  • 數據中心被阻而住宅超預算——先縮爬之範(少網址、慢頻),再升等
  • 不能得有書面選入同意之供者——再思爬之是否必要

第三步:以 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

得:有狀之流跨請保 cookie;匿名之大爬諸請示 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 共子網);換池類或止之
  • 每錄之費五倍於預期——力快取、去重、可批則批

  • 第一步合法察於行碼前以書記之
  • 無代理憑據、池網址、會話 ID 入追蹤之文件(grep gateway.proxy=、供者主機名)
  • .env(或等者)入 .gitignore
  • 池之擇有理:可行之最廉等,住宅/行動之同意之模已驗
  • IP 之變於回響之點驗於實爬前
  • 有狀之流用粘性會話;匿名大爬用每請輪轉
  • 預算之限(請數、時、敗)已裝且試
  • 速限(≥1s)仍存——輪轉非洪爬之藉
  • robots.txt 仍守——輪轉不能凌之

  • 隱身未盡而輪轉:站常不需新 IP——需實之 User-Agent、TLS 指紋、慢頻。先試 StealthyFetcher 與速限;輪轉費高而德疵,無故勿施
  • 硬編憑據:粘代理 URL 入源,洩於 git、容器之像、棧之蹤。必自環境變量或秘密管理者讀
  • 會話中輪轉:每請輪轉破依 cookie、CSRF 令、購物車狀者之流。有狀之務用粘性會話
  • 視輪轉為「德之匿」:輪轉藏於目標,然不能化害爬為德爬。ToS、版權、隱私律、速限德皆不變
  • 以住宅代理為高險之為:憑據塞、球鞋搶、地盜流、詐——明出此技之外。汝之用例若似之,則止
  • 以「今有輪轉」忽 robots.txt:輪轉不授許可。其令即令也
  • 無斷閘:無監之循環於計費之代理池,一夜成四位之賬。必限請數、時、敗
  • 擇住宅池而同意不明:某供自「免費 VPN」之 EULA 取出口節點,真用者未嘗讀。寧付溢價以求審計、明選之同意之模

<!-- Keep under 500 lines. Extract large examples to references/EXAMPLES.md if needed. -->

GitHub 저장소

pjt222/agent-almanac
경로: i18n/wenyan/skills/rotate-scraping-proxies
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

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 에이전트 배포 또는 에이전트 워크플로우 오케스트레이션을 요청받았을 때 사용하세요.

스킬 보기