Проверка рекламы требует посещения тысяч веб-страниц для проверки размещения рекламы, безопасности бренда и соответствия требованиям. Многие сайты издателей используют CAPTCHA, которые блокируют автоматические проверки. CaptchaAI поддерживает работу вашего конвейера проверки.
Что проверяет проверка рекламы
| Проверять | Описание | Почему CAPTCHA блокирует это |
|---|---|---|
| Размещение рекламы | Показывается ли объявление над первым экраном? | Автоматические посещения страниц вызывают обнаружение ботов |
| Безопасность бренда | Никакой рекламы рядом с вредным контентом | Массовая проверка URL-адресов напоминает парсинг |
| Видимость | Была ли реклама действительно видна? | headless браузеры, отмеченные Cloudflare |
| Географический таргетинг | Правильное объявление в правильном регионе | Прокси-трафик запускает CAPTCHA |
| Мониторинг конкурентов | Какую рекламу показывают конкуренты? | Массовый поиск объявлений |
Выполнение
import requests
import time
import re
import json
import os
from datetime import datetime
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_captcha(method, params):
params["key"] = API_KEY
params["method"] = method
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(resp.text)
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 result.text.startswith("OK|"):
return result.text.split("|", 1)[1]
raise Exception(result.text)
raise TimeoutError()
def verify_ad_placement(url, session):
"""Verify ad placement on a publisher page."""
resp = session.get(url)
# Solve CAPTCHA if present
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text)
if match:
token = solve_captcha("userrecaptcha", {
"googlekey": match.group(1),
"pageurl": url,
})
resp = session.post(url, data={"g-recaptcha-response": token})
html = resp.text
# Check for ad elements
result = {
"url": url,
"timestamp": datetime.utcnow().isoformat(),
"ads_found": [],
"brand_safety": True,
"captcha_solved": match is not None,
}
# Detect ad tags
ad_patterns = [
(r'googletag\.pubads', "Google Ad Manager"),
(r'doubleclick\.net', "DFP/DoubleClick"),
(r'ad\.doubleclick', "DoubleClick"),
(r'amazon-adsystem', "Amazon Ads"),
(r'criteo\.com/.*\.js', "Criteo"),
]
for pattern, name in ad_patterns:
if re.search(pattern, html):
result["ads_found"].append(name)
# Brand safety check — flag problematic content
safety_keywords = [
"violence", "hate speech", "explicit",
"gambling", "illegal",
]
page_text = re.sub(r'<[^>]+>', '', html).lower()
for keyword in safety_keywords:
if keyword in page_text:
result["brand_safety"] = False
break
return result
def run_verification(urls, output_file="verification_report.json"):
"""Run ad verification across multiple publisher URLs."""
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
results = []
for i, url in enumerate(urls):
try:
result = verify_ad_placement(url, session)
results.append(result)
ads = ", ".join(result["ads_found"]) or "None"
safe = "SAFE" if result["brand_safety"] else "UNSAFE"
print(f" [{i+1}/{len(urls)}] {url}: {ads} [{safe}]")
except Exception as e:
results.append({
"url": url,
"error": str(e),
"timestamp": datetime.utcnow().isoformat(),
})
print(f" [{i+1}/{len(urls)}] {url}: ERROR - {e}")
time.sleep(2)
with open(output_file, "w") as f:
json.dump(results, f, indent=2)
# Summary
total = len(results)
safe = sum(1 for r in results if r.get("brand_safety"))
captchas = sum(1 for r in results if r.get("captcha_solved"))
errors = sum(1 for r in results if "error" in r)
print(f"\n Total: {total} | Safe: {safe} | CAPTCHAs solved: {captchas} | Errors: {errors}")
return results
# Publisher URLs to verify
publisher_urls = [
"https://publisher1.com/article/tech-news",
"https://publisher2.com/sports/latest",
"https://publisher3.com/finance/markets",
]
run_verification(publisher_urls)
Масштабирование с помощью издателей, защищенных Cloudflare
Многие издатели премиум-класса используют Cloudflare. Справьтесь как с Cloudflare Turnstile, так и с полными испытаниями:
def handle_cloudflare(url, session):
"""Handle Cloudflare-protected publisher pages."""
resp = session.get(url)
if "cf-turnstile" in resp.text:
match = re.search(r'data-sitekey=["\']([^"\']+)', resp.text)
if match:
token = solve_captcha("turnstile", {
"sitekey": match.group(1),
"pageurl": url,
})
return session.post(url, data={
"cf-turnstile-response": token,
})
if resp.status_code == 403 and "cf-browser-verification" in resp.text:
data = solve_captcha("turnstile", {
"pageurl": url,
"proxy": "user:pass@proxy:port",
"proxytype": "HTTP",
})
# Parse qa_validation_cookie and use same proxy
return data
return resp
Часто задаваемые вопросы
Сколько страниц я могу верифицировать в час?
С CaptchaAI вы можете проверять 200-500 страниц в час в зависимости от частоты CAPTCHA и времени решения.
Работает ли это для проверки видеорекламы?
Этот подход работает для медийной и нативной рекламы. Проверка видеорекламы обычно требует рендеринга в браузере с помощью Selenium или Playwright.
Как мне работать с разными регионами?
Используйте прокси из целевых географических регионов. CaptchaAI поддерживает параметры прокси, поэтому контекст решения соответствует вашему географическому таргетингу.
Связанные руководства
- Парсинг защищенных веб-сайтов
- Рекомендации по настройке прокси-сервера
- Проблемы с капчой в headless браузере