مقدمه
کوکیها بخش کلیدی از هر تعامل وبی هستند: آنها وضعیت جلسه، اطلاعات احراز هویت و تنظیمات کاربر را نگه میدارند. در وب اسکریپینگ با Playwright مدیریت درست کوکیها به شما اجازه میدهد تا حالتهای مختلف کاربر را شبیهسازی کنید، از لاگین جلوگیری از ورود مکرر جلوگیری کنید و شانس برخورد با محدودیتها یا ضدرباتها را کاهش دهید. در پایان این مقاله یاد میگیرید چگونه کوکیها را بخوانید، ذخیره/بارگذاری کنید، حذف و اصلاح کنید و نکات عملی برای محیطهای تولیدی را پیادهسازی کنید.
خلاصه سریع (TLDR)
در اینجا یک نمونه کوتاه با API همزمان Playwright در پایتون برای گرفتن، اضافه کردن و پاکسازی کوکیها آمده است. سپس بخشهای بعدی هر قدم را با جزئیات توضیح میدهد.
from playwright.sync_api import sync_playwright
with sync_playwright() as pw:
browser = pw.chromium.launch()
context = browser.new_context()
page = context.new_page()
page.goto("https://example.com")
# گرفتن همه کوکیها
cookies = context.cookies()
print(cookies)
# اضافه کردن یک کوکی جدید (ورودی: لیست دیکشنریهای کوکی)
context.add_cookies([{"name": "session", "value": "1234", "url": "https://example.com/"}])
# پاکسازی همه کوکیها
context.clear_cookies()
browser.close()
ورودیها: در add_cookies لیستی از آبجکتهای کوکی گذاشته میشود؛ خروجیها: cookies() لیستی از دیکشنریهای کوکی بازمیگرداند. clear_cookies() همه کوکیهای context را حذف میکند.
درک ساختار و انواع کوکی
کوکیها شامل فیلدهایی مثل name، value، domain، path، expires و flagهایی مثل httpOnly، secure و sameSite هستند. دو نوع اصلی وجود دارد:
- Session cookie: بدون expires یا maxAge و با بسته شدن مرورگر پاک میشود.
- Persistent cookie: دارای تاریخ انقضا و روی دیسک ذخیره میشود.
نکات مهم: هر کوکی معمولاً محدودیت حجمی (~4KB) دارد و httpOnly برای جلوگیری از دسترسی جاوااسکریپت مفید است؛ اما Playwright میتواند این نوع کوکیها را هم بخواند چون در سطح مرورگر کار میکند.
گرفتن و فیلتر کردن کوکیها
برای گرفتن همه کوکیهای یک context از context.cookies() استفاده کنید. میتوانید ورودی urls به آن بدهید تا فقط کوکیهای مرتبط با دامنه خاص برگردانده شود.
# گرفتن کوکیهای مربوط به یک url خاص
cookies = context.cookies(["https://www.google.com/"])
# فیلتر بر اساس نام
session = [c for c in cookies if c.get("name") == "session_id"]
print(session)
گامها: اول صفحه را بارگذاری کنید، سپس context.cookies() فراخوانی کنید، بعد با لیستکمپرهِنشن یا توابعی مثل filter/find نتایج را فیلتر کنید. این الگو برای تست مقدارهای خاص کوکی یا استخراج توکنهای احراز هویت مفید است.
قبول پنجرههای consent (گرفتن رضایت کوکی)
بهخاطر قوانین حریم خصوصی مثل GDPR و ePrivacy، بسیاری از سایتها پنجرههای رضایت کوکی نشان میدهند. برای اسکریپ کردن، معمولاً باید selector مربوطه را یافته و کلیک کنید؛ هر سایت نیاز به selector یا منطق خاص خود دارد.
# مثال: کلیک روی دکمه قبول
page.goto("https://example.com")
accept = page.wait_for_selector("button.accept-cookies", timeout=5000)
if accept:
accept.click()
# بررسی ذخیره شدن کوکی پس از کلیک
print(context.cookies())
نکته عملی: از wait_for_selector با timeout معقول استفاده کنید و همیشه مسیر جایگزین (fallback) برای حالتهایی که پنجره وجود ندارد در نظر بگیرید.
ذخیره و بارگذاری کوکیها محلی
برای اجتناب از لاگین مکرر یا حفظ جلسه بین اجراها، کوکیها را ذخیره و دوباره بارگذاری کنید. دو روش مرسوم:
- نوشتن مستقیم لیست کوکیها با json.dump
- استفاده از context.storage_state(path=...) که علاوه بر کوکیها localStorage/sessionStorage را هم ذخیره میکند.
import json
# ذخیره کوکیها به فایل
cookies = context.cookies()
with open("cookies.json","w", encoding="utf-8") as f:
json.dump(cookies, f)
# بارگذاری از فایل و اضافه کردن به کانتکست
with open("cookies.json","r", encoding="utf-8") as f:
cookies = json.load(f)
context.add_cookies(cookies)
ورودی: فایل JSON با آرایه کوکیها. خروجی: پس از add_cookies، درخواستهای بعدی به دامنههای مربوطه کوکیها را خواهند فرستاد.
حذف کوکیها (کامل یا انتخابی)
دلایل حذف کوکی: شروع جلسه جدید، تست سناریوهای مختلف، یا تغییر اعتبارها. دو رویکرد وجود دارد:
- پاک کردن همه: context.clear_cookies()
- حذف یک کوکی خاص: بازنویسی آن با expires برابر با 0 یا مقدار گذشته
# حذف همه
context.clear_cookies()
# حذف یک کوکی با تنظیم expires به 0
cookies = context.cookies()
cookie_to_delete = next((c for c in cookies if c.get("name")=="locale"), None)
if cookie_to_delete:
cookie_to_delete["expires"] = 0
context.add_cookies([cookie_to_delete])
نکته: رفتار حذف با بازنویسی expires ممکن است بسته به نسخه مرورگر متفاوت باشد؛ همیشه پس از تغییر، با context.cookies() بررسی کنید.
کار با Session Cookieها
برای ایجاد یک کوکی جلسهای کافیست فیلد expires را ننویسید. این کوکی با بسته شدن context/مرورگر از بین میرود. مثال:
context.add_cookies([{
"name": "session_cookie",
"value": "123456",
"domain": "example.com",
"path": "/",
"httpOnly": True,
"secure": True,
"sameSite": "None"
}])
توصیه: برای امنیت کوکیهای حساس از httpOnly و secure استفاده کنید و در تستها دقت کنید که این ویژگیها با سیاست سایت سازگار باشند.
استفاده در محیط تولید (انتقال احراز هویت)
در تولید معمولاً بهتر است بهجای دستکاری مستقیم کوکیها از storage_state استفاده کنید که مجموعه وضعیت مرورگر را snapshot میگیرد و میتوان آن را به context جدید داد:
# ذخیره state بعد از لاگین
context.storage_state(path="state.json")
# استفاده در کانتکست جدید
new_context = browser.new_context(storage_state="state.json")
new_page = new_context.new_page()
new_page.goto("https://example.com/protected")
این روش امنتر و قابلتکرارتر است و معمولاً برای pipelineهای CI/CD توصیه میشود.
بهترین شیوهها و نکات عملی
- ذخیرهسازی امن: فایلهای state یا کوکی را رمزنگاری یا در محیطهای امن نگهداری کنید چون میتوانند توکنهای احراز هویت را دربرداشته باشند.
- Context مجزا: برای جداسازی وظایف از contextهای جدا استفاده کنید تا حالتها تداخل نداشته باشند.
- بررسی expires: هنگام بارگذاری کوکیها، مقدار expires را بررسی کنید تا از استفاده از کوکی منقضی جلوگیری شود.
- همزیستی با Headless: تست و اجرای نهایی را در حالت headless و headful بررسی کنید—رفتار کوکی و consent گاهی متفاوت است.
- پایداری و Retry: عملیات IO (خواندن/نوشتن فایل، دسترسی به selectorها) را با retry و timeouts مناسب بنویسید.
عیبیابی مشکلات رایج
- اگر کوکیای را نمیبینید: مطمئن شوید که دامنه/پث صحیح را هنگام fetch یا add مشخص کردهاید.
- اگر لاگین کار نمیکند پس از بارگذاری کوکی: بررسی کنید که httpOnly یا سیاست SameSite باعث نشده headerها تغییر کنند.
- سازگاری بین کانتکستها: کوکیها بین contextهای مختلف بهصورت خودکار همگامسازی نمیشوند—از storage_state برای انتقال استفاده کنید.
محدودیتهای Playwright در مدیریت کوکی
- عدم وجود رویدادهای کوکی: Playwright رویداد مخصوص تغییر کوکی ارائه نمیدهد؛ باید خودتان دورهای بررسی کنید یا منطق پیگیری تغییرات را اضافه کنید.
- قابلیتهای متفاوت مرورگرها: رفتار cookie flags ممکن است بین Chromium، Firefox و WebKit متفاوت باشد؛ در تستهای کراس-براوزر توجه کنید.
جمعبندی
مدیریت کوکیها در وب اسکریپینگ با Playwright یک ابزار قدرتمند برای حفظ جلسات، عبور از لاگین مکرر و تست حالتهای متفاوت کاربران است. با استفاده از context.cookies()، add_cookies، clear_cookies و storage_state میتوانید جریانهای کاری قابلتکرار و امن بسازید. در محیط تولید از contextهای جدا، ذخیره امن state و بررسی منظم expiration استفاده کنید تا اسکریپها پایدار و قابل اتکا بمانند.





