Thư viện requests của Python xử lý HTTP hiệu quả nhưng CAPTCHA yêu cầu bộ giải bên ngoài. Hướng dẫn này chỉ ra cách tích hợp CaptchaAI vào tập lệnh quét Python - hầu hết các trang web không cần trình duyệt.
Yêu cầu
| Yêu cầu | Chi tiết |
|---|---|
| Python 3.7+ | Với pip |
| yêu cầu | pip install requests |
| beautifulsoup4 | pip install beautifulsoup4 |
| Khóa API CaptchaAI | Từcaptchaai.com |
Lớp người trợ giúp CaptchaAI
Xây dựng lớp bộ giải có thể sử dụng lại cho các dự án Python của bạn:
import requests
import time
class CaptchaSolver:
def __init__(self, api_key):
self.api_key = api_key
self.base = "https://ocr.captchaai.com"
def _submit(self, params):
params["key"] = self.api_key
resp = requests.get(f"{self.base}/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
return resp.text.split("|")[1]
def _poll(self, task_id, timeout=300):
deadline = time.time() + timeout
while time.time() < deadline:
time.sleep(5)
resp = requests.get(f"{self.base}/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id
})
if resp.text == "CAPCHA_NOT_READY":
continue
if resp.text.startswith("OK|"):
return resp.text.split("|")[1]
raise Exception(f"Solve error: {resp.text}")
raise TimeoutError("Solve timed out")
def solve_recaptcha_v2(self, site_key, page_url):
task_id = self._submit({
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
return self._poll(task_id)
def solve_recaptcha_v3(self, site_key, page_url, action="verify"):
task_id = self._submit({
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action
})
return self._poll(task_id)
def solve_turnstile(self, site_key, page_url):
task_id = self._submit({
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
return self._poll(task_id)
def solve_image(self, image_base64):
task_id = self._submit({
"method": "base64",
"body": image_base64
})
return self._poll(task_id)
Quét biểu mẫu được bảo vệ bằng reCAPTCHA
from bs4 import BeautifulSoup
import requests
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
# Step 1: Load the page
url = "https://example.com/search"
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")
# Step 2: Extract the site key
recaptcha_div = soup.find("div", class_="g-recaptcha")
site_key = recaptcha_div["data-sitekey"]
# Step 3: Solve the CAPTCHA
token = solver.solve_recaptcha_v2(site_key, url)
# Step 4: Submit the form with the token
form_data = {
"q": "search term",
"g-recaptcha-response": token
}
result = session.post(url, data=form_data)
# Step 5: Parse the results
result_soup = BeautifulSoup(result.text, "html.parser")
items = result_soup.find_all("div", class_="result-item")
for item in items:
print(item.text.strip())
Quét nhiều trang
Đối với kết quả được phân trang đằng sau CAPTCHA:
def scrape_all_pages(base_url, site_key, max_pages=10):
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
all_results = []
for page_num in range(1, max_pages + 1):
page_url = f"{base_url}?page={page_num}"
# Solve CAPTCHA for each page if needed
token = solver.solve_recaptcha_v2(site_key, page_url)
resp = session.get(page_url, params={
"g-recaptcha-response": token,
"page": page_num
})
soup = BeautifulSoup(resp.text, "html.parser")
items = soup.find_all("div", class_="item")
if not items:
break
all_results.extend([item.text.strip() for item in items])
print(f"Page {page_num}: {len(items)} items")
time.sleep(2) # Polite delay
return all_results
Xử lý CAPTCHA hình ảnh
Đối với các trang web có CAPTCHA văn bản dựa trên hình ảnh:
import base64
def scrape_with_image_captcha(url):
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")
# Find the CAPTCHA image
captcha_img = soup.find("img", {"id": "captcha-image"})
captcha_url = captcha_img["src"]
# Download and encode the image
img_resp = session.get(captcha_url)
img_base64 = base64.b64encode(img_resp.content).decode()
# Solve
captcha_text = solver.solve_image(img_base64)
# Submit
form_data = {
"captcha": captcha_text,
"username": "user"
}
result = session.post(url, data=form_data)
return result.text
Xử lý lỗi và thử lại
Thêm logic thử lại cho các trình dọn dẹp sản xuất:
def solve_with_retry(solver, site_key, page_url, max_retries=3):
for attempt in range(max_retries):
try:
return solver.solve_recaptcha_v2(site_key, page_url)
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"Attempt {attempt + 1} failed: {e}. Retrying...")
time.sleep(2)
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
ERROR_WRONG_USER_KEY |
Khóa API không hợp lệ | Xác minh khóa từ bảng điều khiển |
ERROR_ZERO_BALANCE |
Không có tiền | Nạp tiền vào tài khoản của bạn |
| Việc gửi biểu mẫu sẽ trả lại trang CAPTCHA | Mã thông báo đã hết hạn hoặc tên trường sai | Sử dụng token ngay lập tức; kiểm tra tên trường biểu mẫu |
ConnectionError |
Sự cố mạng | Thêm logic thử lại với thời gian chờ theo cấp số nhân |
| Kết quả trống sau khi gửi | Trang web yêu cầu cookie/session | Sử dụng requests.Session() để duy trì cookie |
Câu hỏi thường gặp
Tôi có cần Selenium để quét CAPTCHA bằng Python không?
Không phải lúc nào cũng vậy. Nếu biểu mẫu của trang web hoạt động với các yêu cầu HTTP POST tiêu chuẩn thì requests + CaptchaAI sẽ nhanh hơn và nhẹ hơn Selenium. Chỉ sử dụng Selenium khi trang web yêu cầu hiển thị JavaScript.
Tôi có thể giải CAPTCHA một cách không đồng bộ không?
Đúng. Sử dụng aiohttp với API của CaptchaAI cho quy trình làm việc không đồng bộ. Nhìn thấyTích hợp aiohttp + CaptchaAI.
Làm cách nào để xử lý giới hạn tỷ lệ?
Thêm độ trễ giữa các yêu cầu (time.sleep(2-5)), xoay proxy và sử dụng các tiêu đề thực tế. Nhìn thấyXoay vòng proxy để quét CAPTCHA.
Hướng dẫn liên quan
- Xử lý CAPTCHA Selenium bằng Python
- Quét CAPTCHA bằng Node.js
- Cạo mà không bị chặn