مقدمه
خطای Cloudflare 1020 (Access Denied) زمانی رخ میدهد که درخواستهای شما توسط قوانین فایروال وبسایت مسدود شوند. برای یک توسعهدهنده پایتون در سطح متوسط، هدف این مقاله ارائهٔ راهبردهای فنی، مثالهای عملی و نکات بهترینروش برای ادامهٔ اسکریپینگ بهصورت پایدار و اخلاقی است. در پایان مطلب، با علتهای رایج مسدودی، تکنیکهای قابل اجرا (پراکسی، تغییر هدر، مرورگرهای تقویتشده)، مثالهای کد و هشدارهای حقوقی آشنا میشوید.
علتهای رایج خطای 1020
Cloudflare و سرویسهای مشابه از ترکیبی از تکنیکها برای تشخیص ترافیک مخرب یا خودکار استفاده میکنند. شناخت این مکانیزمها به شما کمک میکند راهحل مناسب را انتخاب کنید:
- TLS و TLS fingerprinting (قابلیت تشخیص مشخصات کلاینت در handshake)
- JavaScript fingerprinting و بررسی رفتارهای اجراشده در مرورگر
- تحلیل آدرسهای IP، امتیاز اعتبار و نرخ درخواستها
- الگوهای اتصال HTTP: هدرها، ترتیب درخواستها، Keep-Alive و HTTP/2
- سیاستهای فایروال سفارشی که قواعد خاصی (مثلاً کشور یا مسیرهای خاص) را مسدود میکنند
اصول کلی مقابله برای اسکریپرها
قبل از اجرای هر تکنیکی، ابتدا هدف و سطح دسترسی مجاز را مشخص کنید و قانونی بودن کار را بررسی کنید. در سطح فنی، رویکردها معمولاً یکی از این دستهها هستند:
- پنهانسازی هویت کلاینت: چرخش پراکسی، چرخش User-Agent و همگامسازی هدرها
- نمایش رفتار انسانی: نرخدهی (rate limiting) مناسب، تاخیر تصادفی و حفظ سشنها و کوکیها
- استفاده از مرورگرهای تقویتشده (fortified headless) که JavaScript واقعی اجرا میکنند
- استفاده از پروکسیهای هوشمند یا سرویسهای تجمیعشده که مکانیسمهای bypass را مدیریت میکنند
- در موارد خاص، خواندن نسخههای کش (مثل موتورهای جستجو) یا درخواست مستقیم به origin (با احتیاط قانونی)
مثال عملی — پایتون: requests با پراکسی چرخان و backoff
import requests
import random
import time
from requests.exceptions import RequestException
PROXIES = [
'http://user:pass@proxy1:8000',
'http://user:pass@proxy2:8000',
# ... لیست پراکسیها
]
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
]
def fetch(url, max_retries=5):
session = requests.Session()
for attempt in range(1, max_retries + 1):
proxy = random.choice(PROXIES)
headers = {
'User-Agent': random.choice(USER_AGENTS),
'Accept': 'text/html,application/xhtml+xml',
'Accept-Language': 'en-US,en;q=0.9',
}
try:
resp = session.get(url, headers=headers, proxies={'http': proxy, 'https': proxy}, timeout=15)
resp.raise_for_status()
return resp.text
except RequestException as e:
backoff = min(2 ** attempt, 30) + random.random()
time.sleep(backoff)
raise RuntimeError('Failed to fetch after retries')
توضیح:
- ورودی: url رشتهٔ هدف؛ خروجی: HTML صفحه یا خطا.
- نقش هر بخش: لیست PROXIES برای مخفیسازی IP، USER_AGENTS برای تغییر هدر، و مکانیزم retry با backoff برای مقابله با رد موقتی یا throttling.
- خطبهخط: انتخاب پراکسی و UA بهشکل تصادفی → ارسال درخواست با session → بررسی استاتوس → در صورت خطا به تاخیر افزایشی برمیگردیم.
مثال عملی — پایتون: استفاده از undetected_chromedriver برای لایهٔ JS
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--window-size=1280,800')
# اضافه کردن پراکسی (در صورت نیاز)
# options.add_argument('--proxy-server=http://proxy:port')
browser = uc.Chrome(options=options)
try:
browser.get('https://example.com')
# صبر برای رندر شدن جاوااسکریپت لازم است
html = browser.page_source
print(len(html))
finally:
browser.quit()
توضیح:
- این مثال مرورگر را اجرا میکند و JavaScript سمت مشتری را کامل اجرا میکند؛ مناسب برای وبسایتهایی که محتوای اصلی با JS تولید میشود یا از fingerprinting پیچیده استفاده میکنند.
- نکات عملی: حفظ کوکیها بین تبها، استفاده از پروفایل واقعی و اضافهکردن تغییرات هدر/تاخیر برای القای رفتار انسانی ضروری است.
مثال عملی — Node.js: Puppeteer با پلاگین Stealth
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
;(async () => {
const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] })
const page = await browser.newPage()
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...')
await page.goto('https://example.com', { waitUntil: 'networkidle2', timeout: 30000 })
const content = await page.content()
console.log('Length:', content.length)
await browser.close()
})()
توضیح:
- پلاگین stealth بسیاری از نشتهای شناختهشده در headless را پچ میکند؛ اما دائماً باید آپدیت شود زیرا سرویسهای ضدربات هم در حال تکاملاند.
- ورودی: URL؛ خروجی: HTML رندرشده. نقاط ضعف: هزینهٔ بالاتر در مصرف CPU/MEM و پهنای باند.
بهینهسازی هدرها، کوکیها و رفتار
جزئیات کوچک میتواند تفاوت بین مسدود شدن و دسترسی موفق را رقم بزند:
- هماهنگسازی هدرها: User-Agent باید با Accept، Accept-Language و الگوی کلی ترافیک شما همخوانی داشته باشد.
- مدیریت کوکی و سشن: نگهداری کوکی بین درخواستها رفتار یک کاربر واقعی را شبیهسازی میکند.
- تاخیر و نرخدهی: از الگوریتمهای تصادفی و backoff نمایشی استفاده کنید؛ از burstهای شدید جلوگیری کنید.
- پایش خطاها: لاگ دقیق، شمارش خطا به ازای هر پراکسی و چرخهٔ حذف پراکسیهای بد ضروری است.
- TLS/ALPN: استفاده از client TLS stack استاندارد (نه کتابخانههای بسیار قدیمی یا سفارشی) کمک میکند fingerprint کمتر مشکوک باشد.
عملکرد، هزینه و مقیاس
انتخاب ابزار روی هزینه و مقیاس تأثیر میگذارد:
- Headless کامل (Puppeteer/Selenium) مصرف شبکه و RAM بیشتری دارد؛ برای اسکریپینگ در مقیاس بزرگ ممکن است هزینهٔ پهنای باند و منابع افزایش یابد.
- پراکسیهای مسکونی یا موبایل اعتبار بالاتری دارند اما هزینهٔ هر گیگ بیشتر است؛ پروکسیهای دیتاسنتر ارزانتر و کمتر قابل اعتماد در مقابل کنترل ضدرباتها هستند.
- برای مقیاس: از batching، pagination و صفبندی کارها استفاده کنید تا حافظه کنترل شود و امکان retry و resume فراهم گردد.
محدودیتها و هشدارهای امنیتی/قانونی
حتماً قبل از اسکریپینگ موارد زیر را در نظر بگیرید:
- رعایت قوانین محلی و شرایط خدمات سایت (Terms of Service).
- اجتناب از جمعآوری دادههای شخصی بدون رضایت واضح؛ این کار میتواند پیگرد قانونی داشته باشد.
- از روشهایی که باعث بارگذاری بیش از حد سرور هدف میشوند پرهیز کنید؛ این رفتار میتواند به عنوان حمله تلقی شود.
چکلیست عملی برای اجرای امن و موثر
- ابتدا robots.txt و TOS را بررسی کنید.
- از چرخش پراکسی و چرخش User-Agent استفاده کنید.
- رفتار انسانی شبیهسازی کنید: تاخیر، کوکی و ارجاعدهنده (Referer).
- استفاده از headless تقویتشده فقط در صورت نیاز واقعی به JS اجرا شده.
- لاگگیری، مانیتورینگ و حذف پراکسیهای مشکلدار را پیادهسازی کنید.
جمعبندی
عبور از Cloudflare و بهطور کلی مقابله با خطای 1020 نیازمند رویکرد ترکیبی است: پنهانسازی IP، همسانسازی هدرها، شبیهسازی رفتار انسانی و استفاده حسابشده از مرورگرهای تقویتشده. همیشه قبل از اعمال هر روش، جوانب حقوقی را بسنجید و از روشهایی استفاده کنید که پایداری و هزینهٔ پروژه را در نظر میگیرند. با پیادهسازی لاگینگ، retry هوشمند و مدیریت پراکسی میتوانید فرآیند اسکریپینگ خود را قابل اتکاتر و کمتر آسیبزننده به هدف کنید.
آسان اسکریپ را در گوگل بهعنوان منبع ترجیحی انتخاب کن
مقالههای جدید ما زودتر و پررنگتر در نتایج گوگل و Discover برایت نمایش داده میشود. افزودن از تنظیمات گوگل





