Sebagian besar situs web bernilai tinggi menggunakan CAPTCHA sebagai bagian dari pertahanan anti-botnya. Panduan ini mencakup strategi untuk melakukan scraping situs-situs ini dengan andal menggunakan CaptchaAI, termasuk cara mengidentifikasi jenis CAPTCHA, menyelesaikannya secara otomatis, dan membuat scraper yang tangguh.
Implementasi CAPTCHA Umum
| CAPTCHA | Dimana Digunakan | Metode CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | Formulir login, halaman pencarian | method=userrecaptcha |
| reCAPTCHA v3 | Penilaian latar belakang di halaman mana pun | method=userrecaptcha&version=v3 |
| Cloudflare Turnstile | Situs di balik Cloudflare | method=turnstile |
| Cloudflare Challenge | Blok Cloudflare satu halaman penuh | method=cloudflare_challenge |
| Gambar/OCR CAPTCHA | Situs warisan, Amazon | method=base64 |
| hCaptcha | Situs yang berfokus pada privasi | method=hcaptcha |
Strategi 1: Deteksi dan Selesaikan Sesuai Request
Pendekatan yang paling dapat diandalkan – scraping secara normal dan menyelesaikan CAPTCHA hanya jika muncul:
import requests
import time
from bs4 import BeautifulSoup
API_KEY = "YOUR_API_KEY"
class ProtectedScraper:
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
def scrape(self, url):
resp = self.session.get(url)
# Check for CAPTCHA
if self._has_captcha(resp.text):
resp = self._handle_captcha(resp.text, url)
return resp.text
def _has_captcha(self, html):
indicators = ["g-recaptcha", "cf-turnstile", "h-captcha", "captcha"]
return any(ind in html.lower() for ind in indicators)
def _handle_captcha(self, html, url):
soup = BeautifulSoup(html, "html.parser")
# reCAPTCHA v2
rc = soup.find("div", class_="g-recaptcha")
if rc:
token = self._solve_recaptcha(rc["data-sitekey"], url)
return self.session.post(url, data={"g-recaptcha-response": token})
# Cloudflare Turnstile
ts = soup.find("div", class_="cf-turnstile")
if ts:
token = self._solve_turnstile(ts["data-sitekey"], url)
return self.session.post(url, data={"cf-turnstile-response": token})
raise Exception("Unknown CAPTCHA type")
def _solve_recaptcha(self, site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
})
return self._poll(resp.text.split("|")[1])
def _solve_turnstile(self, site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "turnstile",
"sitekey": site_key, "pageurl": page_url
})
return self._poll(resp.text.split("|")[1])
def _poll(self, task_id):
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
# Usage
scraper = ProtectedScraper()
html = scraper.scrape("https://example.com/data")
Strategi 2: Solve Awal untuk Halaman CAPTCHA yang Diketahui
Jika Anda mengetahui halaman mana yang selalu memiliki CAPTCHA, selesaikan terlebih dahulu:
def scrape_known_captcha_page(url, site_key):
# Solve before even loading the page
token = solve_recaptcha(site_key, url)
# Submit directly with token
resp = requests.post(url, data={
"g-recaptcha-response": token,
"query": "search term"
})
return resp.text
Strategi 3: Situs yang Dilindungi Cloudflare
Situs di belakang Cloudflare sering kali memerlukan cookie qa_validation_cookie:
def get_cloudflare_clearance(url, proxy):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "cloudflare_challenge",
"pageurl": url,
"proxy": proxy,
"proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if "qa_validation_cookie" in result.text:
# Parse qa_validation_cookie and user_agent from response
return result.text
raise TimeoutError()
Pola Scraping Multi-Halaman
def scrape_multiple_pages(base_url, site_key, pages):
scraper = ProtectedScraper()
results = []
for page in pages:
url = f"{base_url}?page={page}"
try:
html = scraper.scrape(url)
soup = BeautifulSoup(html, "html.parser")
items = soup.find_all("div", class_="item")
results.extend([item.text.strip() for item in items])
print(f"Page {page}: {len(items)} items")
except Exception as e:
print(f"Page {page} failed: {e}")
time.sleep(random.uniform(2, 5))
return results
Pemecahan Masalah
| Masalah | Perbaiki |
|---|---|
| CAPTCHA muncul di setiap halaman | Gunakan proxy; mengurangi tingkat request |
| Token ditolak setelah diselesaikan | Token mungkin telah kedaluwarsa; gunakan dalam waktu 120 detik |
| Cloudflare memblokir meskipun ada izin | Gunakan proxy dan agen pengguna yang sama untuk semua request |
| Situs mengembalikan halaman berbeda setelah solve | Periksa pengalihan atau cookie tambahan |
Pertanyaan Umum
Situs mana yang paling sulit untuk dikikis?
Situs yang menggunakan Cloudflare Enterprise, PerimeterX, atau Akamai Bot Manager adalah yang paling menantang. CaptchaAI menangani komponen CAPTCHA-nya; gabungkan dengan browser tersembunyi dan proxy untuk hasil terbaik.
Bisakah saya scraping situs yang memerlukan login?
Ya. Masuk terlebih dahulu (selesaikan CAPTCHA login apa pun), pertahankan cookie sesi, lalu kikis halaman yang diautentikasi. CaptchaAI menangani CAPTCHA pada tahap apa pun.
Bagaimana cara menangani halaman yang dirender JavaScript?
Gunakan Selenium, Puppeteer, atau Playwright untuk merender JavaScript, lalu ekstrak parameter CAPTCHA dan selesaikan melalui CaptchaAI. MelihatPenanganan Selenium CAPTCHA.
Panduan Terkait
- Cara Menangani Tantangan CAPTCHA dalam Alur Kerja Scraping Web
- Masalah CAPTCHA Browser Headless
- Deteksi CAPTCHA dalam Scraping Dijelaskan