

کوکیها بخش کلیدی از هر تعامل وبی هستند: آنها وضعیت جلسه، اطلاعات احراز هویت و تنظیمات کاربر را نگه میدارند. در وب اسکریپینگ با Playwright مدیریت درست کوکیها به شما اجازه میدهد تا حالتهای مختلف کاربر را شبیهسازی کنید، از لاگین جلوگیری از ورود مکرر جلوگیری کنید و شانس برخورد با محدودیتها یا ضدرباتها را کاهش دهید. در پایان این مقاله یاد میگیرید چگونه کوکیها را بخوانید، ذخیره/بارگذاری کنید، حذف و اصلاح کنید و نکات عملی برای محیطهای تولیدی را پیادهسازی کنید.
در اینجا یک نمونه کوتاه با 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 هستند. دو نوع اصلی وجود دارد:
نکات مهم: هر کوکی معمولاً محدودیت حجمی (~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 نتایج را فیلتر کنید. این الگو برای تست مقدارهای خاص کوکی یا استخراج توکنهای احراز هویت مفید است.
بهخاطر قوانین حریم خصوصی مثل 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) برای حالتهایی که پنجره وجود ندارد در نظر بگیرید.
برای اجتناب از لاگین مکرر یا حفظ جلسه بین اجراها، کوکیها را ذخیره و دوباره بارگذاری کنید. دو روش مرسوم:
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
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() بررسی کنید.
برای ایجاد یک کوکی جلسهای کافیست فیلد 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 توصیه میشود.
مدیریت کوکیها در وب اسکریپینگ با Playwright یک ابزار قدرتمند برای حفظ جلسات، عبور از لاگین مکرر و تست حالتهای متفاوت کاربران است. با استفاده از context.cookies()، add_cookies، clear_cookies و storage_state میتوانید جریانهای کاری قابلتکرار و امن بسازید. در محیط تولید از contextهای جدا، ذخیره امن state و بررسی منظم expiration استفاده کنید تا اسکریپها پایدار و قابل اتکا بمانند.


