مقدمه
در این مقاله بهصورت عملی و مبتنی بر داده میآموزید چگونه روشهای مختلف درخواستسازی (از HTTP ساده تا مرورگرهای خودکار) را برای اسکریپینگ بررسی کنید، چطور نشانههای بلاک را تشخیص دهید و چه استراتژیهایی برای افزایش نرخ موفقیت به کار ببرید. هدف این نوشته این است که شما پس از خواندن بتوانید یک برنامه آزمایشی برای هدفگذاری سایتهای مختلف بسازید و تصمیمات آگاهانهای درباره پراکسی، هدرها و استفاده از مرورگرهای headless بگیرید.
روشهای آزمایشی و دستهبندی
در عمل چهار رویکرد متداول را خواهید دید: درخواستهای نکِد با کتابخانههایی مثل requests، درخواستهای با هدرهای سفارشی، شبیهسازی کامل مرورگر (Playwright/Puppeteer) و نسخههای «استلت» از مرورگرها. هر روش نقاط قوت و ضعف دارد و نتایج بسته به دسته سایت (فروشگاه، خبر، کاریابی، شبکه اجتماعی) متفاوت است.
- نکِد (Plain HTTP): کمهزینه، سریع ولی با اثر انگشت HTTP مشخص.
- هدرهای سفارشی: تغییر User-Agent و مجموعه هدرها؛ اغلب برای سایتهای مبتنی بر تحلیل هدر کافی است.
- مرورگر کامل: رندر جاوااسکریپت، مناسب سایتهای دینامیک ولی بسیار قابل شناسایی.
- مرورگر استلت: تلاش برای مخفی کردن ویژگیهای headless؛ ممکن است در برخی سایتها مفید باشد اما تضمینی نیست.
مثال عملی با requests (پایتون)
این مثال نشان میدهد چگونه درخواست ساده با هدرهای کامل ارسال و پاسخ برای علائم بلاک بررسی میشود.
import requests
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://example.com/'
}
def fetch(url, proxy=None, timeout=10):
"""ورودی: url (رشته)، proxy (رشته یا None)، timeout.
خروجی: شی response. مسئول ارسال GET و برگرداندن response است.
"""
resp = requests.get(url, headers=HEADERS, proxies={'http': proxy, 'https': proxy} if proxy else None, timeout=timeout)
return resp
# استفاده:
# resp = fetch('https://target.site')
# print(resp.status_code)
توضیح خطبهخط:
- تعریف HEADERS با هدرهای مرسوم مرورگر، تا آنالیز ساده براساس User-Agent را دور بزنیم.
- fetch تابعی ساده است که URL را میگیرد و در صورت نیاز پراکسی میپذیرد؛ خروجی یک requests.Response است.
- این تابع فقط درخواست را میفرستد؛ بررسی بلاک در مرحله بعد انجام میشود.
تشخیص بلاک در بدنه پاسخ
کد زیر نشان میدهد چگونه نه تنها وضعیت HTTP بلکه متن HTML را برای علائم بلاک بررسی کنید. بسیاری از سایتها 200 برمیگردانند اما در HTML نشانههای بلاک وجود دارد.
def is_blocked_by_body(text):
"""ورودی: متن HTML
خروجی: True اگر محتوای صفحه شبیه CAPTCHA یا Access Denied باشد."""
checks = [
'captcha',
'access denied',
'bot detected',
'are you human',
'verify',
'please enable javascript'
]
lower = (text or '').lower()
for token in checks:
if token in lower:
return True
# بررسی محتواهای خالی یا بدون
if 'نکات عملی:
- کلمات کلیدی را بر اساس نمونههای واقعی هدفتان تنظیم کنید.
- استفاده از امتیازدهی (score) به جای True/False میتواند حساسیت را کم یا زیاد کند.
نمونه: اجرای Playwright در پایتون برای صفحات جاوااسکریپتی
Playwright وقتی لازم است جاوااسکریپت اجرا شود مفید است. مثال زیر نحوه لود صفحه و استخراج HTML را نشان میدهد.
from playwright.sync_api import sync_playwright
def fetch_with_playwright(url, user_agent=None):
"""ورودی: url، user_agent اختیاری.
خروجی: متن HTML صفحه پس از رندر.
"""
with sync_playwright() as pw:
browser = pw.chromium.launch(headless=True)
context = browser.new_context(user_agent=user_agent) if user_agent else browser.new_context()
page = context.new_page()
page.goto(url, timeout=30000)
html = page.content()
browser.close()
return html
# html = fetch_with_playwright('https://target.site')
توضیحات:
- Playwright رندر کامل صفحه را اجرا میکند و مناسب زمانهایی است که محتوای اصلی با جاوا اسکریپت تولید میشود.
- اگر وبسایت headless را تشخیص میدهد، باید حقههای بیشتری اعمال کنید (تنظیم استیتهای navigator، حذف navigator.webdriver و غیره) که ممکن است قوانین سرویس را نقض کند؛ همیشه جنبههای قانونی را بررسی کنید.
استراتژی پراکسی و زمانبندی
یک مورد کلیدی از آزمایشها این بود که تنها چرخش پراکسی کافی نیست؛ الگوی ترافیکی مهمتر است. سایتها با آنالیز نرخ و توزیع درخواستها رفتار مشکوک را تشخیص میدهند.
- از پراکسیهای مسکونی برای تقلید کاربر واقعی استفاده کنید، اما روی چگونگی و زمانبندی تماسها تمرکز کنید.
- از تاخیرهای شبه-انسانی (randomized sleep) و backoff نمایی هنگام مواجهه با 429 استفاده کنید.
- جلسه (session) و کوکیها را حفظ کنید تا رفتار پراکسی معنادارتر باشد.
import random, time
def human_like_sleep(base=1.0, jitter=0.5):
t = base + random.uniform(-jitter, jitter)
time.sleep(max(0.1, t))
# استفاده در حلقه درخواست
# for url in urls:
# resp = fetch(url, proxy=current_proxy)
# human_like_sleep(base=1.2, jitter=0.7)
مدیریت خطا، retry و اعتبارسنجی پاسخ
بهجای retry بیقید و شرط، قوانین زیر را پیشنهاد میکنیم:
- در مواجهه با 5xx → retry محدود با backoff.
- در مواجهه با 429 → افزایش تاخیر و تغییر پراکسی/سشن.
- در مواجهه با محتواهای 200 اما بلاکشده → فوراً stop یا switch strategy (مثلاً از HTTP به مرورگر).
تحلیل دستهای: کدام سایتها به چه چیزهایی حساساند
از دادهها میتوان نتیجه گرفت:
- سایتهای eCommerce اغلب به هدرها حساساند؛ تنظیم دقیق هدرها مفید است.
- Job boards معمولاً ترکیبی از محدودیت IP، CAPTCHAs و دیواره لاگین دارند.
- شبکههای اجتماعی گاهی برعکس عمل میکنند و مرورگرهای استلت را بیشتر هدف میگیرند.
بهترین شیوهها (جمعبندی عملی)
چکلیست عملی برای اسکریپ کردن ایمن و مؤثر:
- همیشه پاسخ HTML را آنالیز کنید، نه فقط status code.
- ابتدا با HTTP ساده شروع کنید و هدرها را تنظیم کنید قبل از رفتن سراغ مرورگر.
- زمانبندی و پراکسی را هوشمندانه مدیریت کنید؛ rate-limiting شایعتر از ban مستقیم است.
- فقط زمانی از مرورگر استفاده کنید که رندر یا تعامل جاوااسکریپت ضروری باشد.
- نسبت به قوانین سایت و ملاحظات حقوقی آگاه باشید؛ اسکریپ کردن پشت لاگین یا paywall اغلب مشکلزا است.
ملاحظات اخلاقی و حقوقی
این روشها بهمنظور پژوهش و توسعه ارائه شدهاند. حتماً قوانین محلی، شرایط خدمات و فایل robots.txt را بررسی کنید. از بارگذاری بیش از حد سرور جلوگیری کنید و از جمعآوری دادههای حساس یا شخصی خودداری نمایید.
جمعبندی
نتیجهگیری کلیدی این است که هیچ روش جهانیای وجود ندارد. تست سیستماتیک روی هر سایت، آنالیز بدنه پاسخ و تطبیق استراتژی (هدرها، پراکسی، زمانبندی، یا مرورگر) ضروری است. با ابزارهای ساده میتوان در بسیاری از موارد موفق شد؛ در عین حال برای سایتهای محافظتشدهتر باید ترکیبی از پراکسی، حل CAPTCHA و مرورگر خودکار را در نظر گرفت.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





