なぜ検出のHappens
Webスクレイピング検出は多層プロセスです。 アンチボットシステムは単一の信号に依存しません。つまり、IP の評判、HTTP ヘッダ、 TLS指紋, ブラウザの指紋リスクスコアを計算する行動分析。 そのスコアがしきい値を超えた場合、ブロックされ、CAPTCHA、または偽りのデータを配信します。
あらゆる層の検出を削減するための包括的なアプローチを提供します。 これらのシステムがどのように機能するかの概要については、当社の柱の記事を参照してください。 アンチボットシステムがプロキシを検出する方法. .
レイヤー1:IP評判とプロキシ選択
IP アドレスは、サーバーが最初に表示されることです。 アンチボットシステムは、タイプ、履歴、行動によってIPアドレスをスコアするデータベースを維持します。
プロキシタイプ選択
| プロキシタイプ | 検出リスク | 最高ののための |
|---|---|---|
| 賃貸住宅 | 低い | ほとんどのスクレイピングタスク、保護されたサイト |
| ISP(州立住宅) | 低媒体 | 長いセッション、アカウント |
| データセンター | 高い | 保護されていないサイト、大量のタスク |
| モバイル | 非常に低い | 最高の保護サイト、ソーシャルメディア |
ほとんどのスクレイピングプロジェクトのために、 ProxyHatの住宅用プロキシ 低い検出の危険および費用効率の最もよいバランスを提供して下さい。 詳細を見る プロキシタイプ比較 指導のため。
IP の回転戦略
# Python: Rotating proxy per request using ProxyHat
import requests
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
"http": proxy_url,
"https": proxy_url
}
# Each request through the gateway gets a different IP
for url in urls_to_scrape:
response = requests.get(url, proxies=proxies, timeout=30)
process(response)
- リクエストごとに回転 ページや検索結果の一覧です。
- スティッキーセッションを使用する 複数ページのフロー(ペジネーション、ログインシーケンス)
- ジオターゲットIP サイトの期待するオーディエンスにマッチする ProxyHatの位置ターゲティング. .
層 2: HTTP ヘッダー
HTTP ヘッダーの誤りや欠落は、アンチ ボット システムを検出するための最も簡単な信号の 1 つです。 実際のブラウザは15-20ヘッダを特定の順序で送信します。デフォルトのPythonスクリプトは3〜4を送信します。
必須ヘッダー
# Python: Realistic header set
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Cache-Control": "max-age=0",
"Sec-Ch-Ua": '"Chromium";v="131", "Not_A Brand";v="24"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"Connection": "keep-alive"
}
response = requests.get(url, headers=headers, proxies=proxies)
ヘッダーの一貫性の規則
- ユーザーエージェントでSec-Ch-Uaをマッチ: Chrome 131 を要求すれば、
Sec-Ch-Uaバージョン131を参照する必要があります。 - すべてのSec-Fetchヘッダーを含める: 現代のChromeは、すべてのナビゲーションにこれらを送信します。 それらが強いボット信号である欠損。
- プロキシジオに合わせて、Accept-Language を設定: 米国のプロキシ
Accept-Language: ja-JP疑わしいです。 - ヘッダーの順序を維持して下さい: 一部のアンチボットシステムでは、ヘッダの注文を確認します。 インサート順を保持するライブラリを使用します。
層3:TLSおよびHTTP/2の指紋
HTTP クライアントライブラリが一意に生成されます TLS指紋 そのアンチボットシステムは、あなたの主張されたユーザーエージェントに対してチェックします。 Python TLS の指紋を持つ Chrome のユーザエージェントはすぐにフラグが付けられます。
言語による移行
| 用語集 | デフォルトライブラリ | 検出リスク | ブラウザグレードの代替 |
|---|---|---|---|
| フィードバック | リクエスト/urllib3 | 非常に高い | curl cffi と impersonate |
| ノード.js | アキシオス/ゴット | 高い | 取得スクレイピング |
| おすすめ | ネット/http | 非常に高い | uTLS +カスタムトランスポート |
# Python: Browser-grade TLS with curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get(
"https://example.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
)
層4:ブラウザの指紋
ヘッドレスブラウザを使用している場合、アンチボット JavaScript は、お使いのブラウザをプローブします。 ブラウザの指紋 — キャンバス、WebGL、AudioContext、ナビゲータープロパティ。 キーの原則は内部の一貫性です:
- すべての指紋信号は、互いに同意しなければなりません
- 指紋は、あなたのユーザーエージェントの主張に一致しなければなりません
- あなたがプロキシを回転させるときに指紋が変更されるべきです
ステルス構成
// Node.js: Puppeteer with stealth and proxy
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080'
]
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
await page.setViewport({ width: 1920, height: 1080 });
層5:行動パターン
完璧な技術移行でも、ボットのような動作パターンが検出をトリガーします。 タイミング、ナビゲーションパターン、インタラクションシグネチャを分析するアンチボットシステム。
リクエストのタイミング
- ランダムな遅延を追加します。 人間は正確な間隔で要求をしません。 リクエスト間のランダム遅延の1-5秒を追加します。
- ページタイプによるVary遅延: コンテンツページは、ページのリストよりも長い「読み込み」停止に値します。
- 破裂パターンを避けて下さい: 急なリクエストを50回し、一時停止しないでください。 自然な分散と均等に要求を分配して下さい。
# Python: Natural request timing
import time
import random
def scrape_with_natural_timing(urls, proxies):
for url in urls:
response = requests.get(url, proxies=proxies, headers=headers)
process(response)
# Random delay: 1-4 seconds with normal distribution
delay = max(0.5, random.gauss(2.5, 0.8))
time.sleep(delay)
ナビゲーションパターン
- 自然な道に続いて下さい: ホームページを最初に訪問し、カテゴリページ、詳細ページ - ディープURLに直接ジャンプしません。
- 適切なレファレンスヘッダを設定します。 各ページは、以前のページを参照して、参照元ページを参照する必要があります。
- ハンドルリダイレクト: 元のURLを再試行するのではなく、自然にHTTPリダイレクトに従ってください。
セッション管理
- クッキー瓶を維持する: セッション内でクッキーを受け入れ、返します。すべてのクッキーはボット信号です。
- セッションの長さの制限: 50-100 リクエストの後、新しい IP と Cookie で新しいセッションを開始します。
- レートの限界を点検して下さい: 429応答を受信したら、すぐに再試行するのではなく、指数関数的にオフします。
層6:応答の検証
検出はブロックに常に結果しません。 サイトは、誤解を招くデータを注入したり、ソフトブロックを返したり、異なるコンテンツを提供したりすることができます。 応答を常に検証します。
- ステータスコードをチェック: 200は、常に成功を意味しません。一部のサイトは、CAPTCHAページまたは空のコンテンツで200を返します。
- コンテンツ構造の検証: 応答に期待される要素(製品価格、記事テキストなど)が含まれていることを確認してください。
- ハニスポットのモニター: 自動クローラーをキャッチするために設計された隠しリンクまたはフォームフィールド。
- 成功率を追跡して下さい: 90%未満の成功率が低下した場合、何かが変更され、調査を必要としています。
包括的な検出チェックリスト
| レイヤー | アクション | 優先順位 |
|---|---|---|
| IPアドレス | ジオターゲティングで住宅用プロキシを使用する | クリティカル |
| IPアドレス | リクエストまたはセッションごとにIPを回転させる | クリティカル |
| ヘッダー | 完全な、現実的なヘッダー セットを送って下さい | クリティカル |
| ヘッダー | プロキシの場所への適合の受け入れ言語 | 高い |
| ツイート | ブラウザグレードの TLS ライブラリを使用する | クリティカル |
| ツイート | 要求されたブラウザにTLS指紋を一致させる | クリティカル |
| ブラウザ | ヘッドレスブラウザ用のステルスプラグインを使用する | 高い |
| ブラウザ | 一貫した指紋プロファイルを維持 | 高い |
| 行動規範 | リクエスト間でランダムな遅延を追加 | 高い |
| 行動規範 | 自然ナビゲーションパスをフォロー | メディア |
| 行動規範 | セッション内でクッキーを維持 | メディア |
| バリデーション | 応答内容をチェックし、ステータスコードではなく | 高い |
例: 完全な反検出のスクレーパー
# Python: Complete anti-detection scraper setup
from curl_cffi import requests as curl_requests
import time
import random
class StealthScraper:
def __init__(self, proxy_user, proxy_pass):
self.proxy = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
def get(self, url, referer=None):
headers = {}
if referer:
headers["Referer"] = referer
response = self.session.get(url, headers=headers, timeout=30)
self.request_count += 1
# Rotate session every 50-80 requests
if self.request_count >= random.randint(50, 80):
self._rotate_session()
# Natural delay
time.sleep(max(0.5, random.gauss(2.0, 0.6)))
return response
def _rotate_session(self):
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
# Usage
scraper = StealthScraper("USERNAME", "PASSWORD")
home = scraper.get("https://example.com")
listing = scraper.get("https://example.com/products", referer="https://example.com")
detail = scraper.get("https://example.com/products/123", referer="https://example.com/products")
あなたのアプローチをエスケープするとき
必要に応じて、最も簡単なアプローチとエスカレートから始めましょう。
- レベル1 — HTTPクライアント+ヘッダー+プロキシ: ほとんどのサイトで動作します。 使用条件
curl_cffiまたはgot-scrapingお問い合わせ ProxyHatプロキシ. . - レベル2 — ブラウザーグレードの TLS を追加します。 当サイトがJA3/JA4の指紋を検査する際に必要です。
- レベル3 - ヘッドレスブラウザ+ステルス: JavaScript レンダリングされたコンテンツおよび洗練されたアンチボット システムに必要な
- レベル4 — 動作する mimicry でフルブラウザの自動化: 最も保護されたサイト(Cloudflare Enterprise、PerimeterX、等)のために予約。
特定の言語の実装パターンについては、ガイドを参照してください。 フィードバック, ノード.jsと おすすめ. .
倫理ガイドライン
反検出技術はツールであり、その倫理的な使用はコンテキストに依存します。 常に:
- Robots.txtとサービス利用規約の尊重
- 公開されているデータのみをScrape
- サーバの衝撃を要求する制限率
- データ保護規則(GDPR、CCPA)に準拠
- 使用条件 倫理的なスクレイピングプラクティス ベースラインとして
反検出の目的は正当な保証を迂回するものではありません。 公的なデータへの自動アクセスが悪意のあるものではないことを保証することです。






