مقدمه
کوکیها یکی از پایههای مدیریت وضعیت در وب هستند و در اسکریپینگ، تست اتوماسیون و احراز هویت نقش مهمی دارند. در این مقاله بهصورت عملی با نحوهٔ خواندن، ایجاد، تغییر، حذف و ذخیرهٔ کوکیها با Selenium در پایتون آشنا میشویم. هدف این راهنما این است که بعد از خواندن آن بتوانید:
- با متدهای اصلی Selenium برای کوکیها کار کنید
- کوکیها را برای حفظ نشست (session) ذخیره/بازیابی کنید
- محدودیتها و نکات امنیتی (مثل httpOnly و SameSite) را مدیریت کنید
- اشکالزدایی و آمادهسازی اسکریپت در محیط تولید را یاد بگیرید
متدهای پایهٔ مدیریت کوکی در Selenium (مرور)
چند متد اصلی که همیشه به آنها برمیگردیم:
- driver.get_cookies() — لیستی از دیکشنریهای کوکیهای فعلی برمیگرداند.
- driver.get_cookie(name) — یک کوکی مشخص را برمیگرداند (یا None).
- driver.add_cookie(cookie_dict) — یک کوکی جدید به مرورگر اضافه میکند (باید روی دامنهٔ مرتبط باشید).
- driver.delete_cookie(name) — یک کوکی مشخص را حذف میکند.
- driver.delete_all_cookies() — همهٔ کوکیها را حذف میکند.
ورودیها/خروجیها: متدهای بالا معمولاً دیکشنری/لیست دیکشنری دریافت یا بازمیگردانند. هر دیکشنری شامل کلیدهایی مثل name, value, domain, path, expiry, httpOnly, secure و غیره است.
نمونهٔ ساده: خواندن و چاپ کوکیها
توضیح: این مثال لیست کوکیهای فعلی را گرفته و چاپ میکند. ورودی: مرورگر باز و روی دامنهٔ موردنظر. خروجی: لیست دیکشنریها.
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://quotes.toscrape.com')
cookies = driver.get_cookies() # خروجی: لیستی از دیکشنریهای کوکی
print('Cookies:', cookies)
driver.quit()
خطبهخط: راهاندازی WebDriver → رفتن به URL → گرفتن کوکیها → چاپ آنها → بستن مرورگر.
افزودن کوکی: قواعد و نکات
نکتهٔ مهم: قبل از افزودن کوکی باید به همان دامنه مراجعه کرده باشید؛ در غیر این صورت Selenium خطا میدهد یا دامین نادیده گرفته میشود. ساختار کوکی معمولاً یک دیکشنری است با کلیدهای حداقل name و value.
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://quotes.toscrape.com')
new_cookie = {'name': 'my_cookie', 'value': 'hello', 'path': '/', 'secure': False}
# باید روی همان دامنه اجرا شود
driver.add_cookie(new_cookie)
print(driver.get_cookie('my_cookie'))
driver.quit()
نکات عملی: اگر میخواهید expiry تعیین کنید، مقدار باید timestamp یونیکس باشد. برای httpOnly و secure از بولین استفاده کنید.
حذف و تغییر کوکیها
حذف با driver.delete_cookie(name) و حذف همه با driver.delete_all_cookies() انجام میشود. برای تغییر مقدار یک کوکی معمولاً آن را خوانده، حذف و سپس با مقادیر جدید اضافه میکنیم (زیرا متد مستقیم تغییر وجود ندارد).
# مثالِ تغییر مقدار کوکی
cookies = driver.get_cookies()
for cookie in cookies:
if cookie['name'] == 'my_cookie':
cookie['value'] = 'new_value'
driver.delete_cookie(cookie['name'])
driver.add_cookie(cookie)
break
نکته: هنگام بازنویسی کوکی مطمئن شوید سایر فیلدها (مانند domain/path/expiry) صحیح هستند؛ در غیر این صورت کوکی جدید ممکن است کاربردی نباشد.
آشنایی با فیلدهای مهم کوکی و پیامدهای امنیتی
- name, value: شناسه و دادهٔ اصلی.
- domain: دامنهای که میتواند کوکی را بخواند/دریافت کند؛ اضافه کردن کوکی برای دامنهٔ متفاوت باعث خطا میشود.
- path: مسیر درون دامنه که اجازهٔ دسترسی دارد؛ معمولاً '/'.
- httpOnly: اگر True باشد، جاوااسکریپت سمت کلاینت نمیتواند آن را بخواند — کاهش خطر XSS.
- secure: اگر True باشد، فقط روی HTTPS ارسال میشود — حفاظت در برابر شنود شبکه.
- sameSite: محدودیت ارسال کوکی در درخواستهای cross-site («Strict», «Lax», «None»). مهم برای CSRF.
- expiry یا expirationDate: timestamp یونیکس برای انقضا؛ عدم تنظیم → کوکی جلسهای.
- hostOnly, session: جزئیات دسترسی و طول عمر.
عملگر: هنگام اسکریپینگ تولیدی، به httpOnly و sameSite توجه کنید — تغییر یا خواندن httpOnly توسط جاوااسکریپت ممکن نیست، ولی Selenium معمولاً مقدار آن را گزارش میدهد و میتواند آن را هنگام add_cookie تنظیم کند.
ذخیره و بارگذاری کوکیها (روش متداول برای حفظ لاگین)
در تولید معمولاً کوکیها را به فایل میریزیم و در نشستهای بعدی دوباره بارگذاری میکنیم. نکتهٔ کلیدی: قبل از افزودن کوکیها باید به دامنهٔ موردنظر رفته باشید.
import json
from selenium import webdriver
# ذخیرهٔ کوکیها
driver = webdriver.Chrome()
driver.get('https://example.com')
# ... پس از لاگین دستی یا اتوماتیک
cookies = driver.get_cookies()
with open('cookies.json', 'w') as f:
json.dump(cookies, f)
driver.quit()
# بارگذاری کوکیها در جلسهٔ جدید
driver = webdriver.Chrome()
driver.get('https://example.com') # مهم: اول به همان دامنه برو
with open('cookies.json') as f:
cookies = json.load(f)
for cookie in cookies:
try:
# حذف کلیدهای غیرقابلپذیرش اگر نیاز است
cookie.pop('sameSite', None)
driver.add_cookie(cookie)
except Exception:
print('failed to add cookie', cookie.get('name'))
driver.refresh()
توضیح خطها: ابتدا کوکیها را با get_cookies() گرفتیم و در فایل JSON نوشتیم. برای بارگذاری، ابتدا به دامنه رفتیم (الزامی) سپس هر کوکی را با add_cookie وارد کردیم و در نهایت صفحه را رفرش کردیم تا نشست فعال شود.
نکات عملی برای محیط تولید
- همیشه قبل از add_cookie به همان دامنه بروید؛ در غیر این صورت اغلب خطا یا بیتأثیری رخ میدهد.
- از نگهداری credentials در فایلهای متنی خودداری کنید؛ از متغیر محیطی یا صندوق امن استفاده کنید.
- برای اسکریپینگِ گسترده از پروفایل مرورگر یا storage اختصاصی استفاده کنید تا کوکیها و cache بین اجراها نگهداری شود.
- در headless mode برخی رفتارها (مثل promptهای 2FA یا popupها) متفاوتاند؛ تست محلی و تولید را با همان تنظیمات اجرا کنید.
- برای اجرای همزمان (concurrency) از یک WebDriver مشترک استفاده نکنید؛ به ازای هر تسک یک پروسه/کانتینر جدا ایجاد کنید.
اشکالزدایی رایج و راهحلها
- خطای افزودن کوکی: مطمئن شوید دامنه/پث تطابق دارند؛ ابتدا به آن URL بروید.
- کوکی اضافه نمیشود یا لاگین نشان داده نمیشود: پس از افزودن کوکیها صفحه را refresh کنید یا از navigate().refresh() استفاده کنید.
- کوکیهای httpOnly در JS دیده نمیشوند: این رفتار طبیعی است؛ برای بازرسی از driver.get_cookies() استفاده کنید.
- خطاهای مربوط به expiry یا فرمت: مطمئن شوید فیلدهای زمان به شکل timestamp یونیکس (عدد صحیح) هستند.
نمونهٔ پیشرفته: ذخیرهٔ کوکی پس از لاگین و استفادهٔ مجدد (LinkedIn/GitHub)
ایدهٔ کلی: با Selenium وارد میشوید، کوکیها را ذخیره میکنید، سپس در اجراهای بعدی آنها را بارگذاری میکنید تا نیازی به لاگین مجدد نباشد. با SPAها (مانند GitHub) معمولاً با افزودن کوکی و رفرش صفحه میتوانید نشست را بازگردانید.
# الگوریتم کلی (نسخه خلاصه)
from selenium import webdriver
from time import sleep
import json
# 1) لاگین و ذخیره کوکیها
driver = webdriver.Chrome()
driver.get('https://github.com/login')
# ... پر کردن فیلدها و کلیک روی ورود (اتومات یا دستی)
# صبر برای 2FA در صورت نیاز
sleep(10)
cookies = driver.get_cookies()
with open('gh_cookies.json','w') as f:
json.dump(cookies, f)
driver.quit()
# 2) استفادهٔ مجدد از کوکیها در جلسهٔ جدید
driver = webdriver.Chrome()
driver.get('https://github.com')
with open('gh_cookies.json') as f:
for cookie in json.load(f):
try:
cookie.pop('sameSite', None) # حذف فیلدهایی که ممکن است اضافه نشوند
driver.add_cookie(cookie)
except Exception:
pass
driver.refresh()
sleep(5)
driver.quit()
هشدارها: برخی سامانهها (بهخصوص سرویسهای حساس) کوکیها را به سختی مدیریت میکنند یا از توکنهای مبتنی بر IP/UA استفاده میکنند؛ بنابراین همیشه از دید امنیتی و رعایت قوانین استفاده کنید و از این روش برای مصارف غیرمجاز بهره نگیرید.
بهترین شیوهها و نکات عملکردی
- بهجای ذخیرهٔ مستقیم رمز عبور در کوکی، از ذخیرهٔ امن کوکیها استفاده کنید و دسترسی فایل را محدود کنید.
- برای اسکریپینگ مقیاسپذیر، ذخیرهٔ کوکی در یک دیتابیس (رمزنگاریشده) و بازیابی امن پیشنهاد میشود.
- مکانیزم retry برای add_cookie و عملیات I/O اضافه کنید تا از خطاهای موقتی صرفنظر کنید.
- در صورت نیاز به تغییر زمان انقضا، مقدار expiry را به timestamp جدید تنظیم و کوکی را بازنویسی کنید.
جمعبندی
مدیریت کوکیها با Selenium یکی از ابزارهای پرقدرت برای نگهداری نشست، تسریع ورود، و تست خودکار است. قوانین کلیدی که باید همیشه به خاطر داشته باشید اینها هستند: اول به دامنه مراجعه کن، بعد کوکی اضافه کن؛ کوکیها را امن ذخیره و بارگذاری کن؛ و برای عملیات در تولید از خطاگیرها و ذخیرهٔ امن استفاده کن. با مثالهای ذخیره/بارگذاری و بازنویسی که در این مقاله دیدید میتوانید سناریوهای واقعی مانند حفظ لاگین در GitHub یا LinkedIn را پیادهسازی کنید—البته با رعایت نکات امنیتی و قانونی.
اگر نیاز دارید، میتوانم یک ماژول پایتون آماده برای مدیریت خودکار کوکیها (ذخیره/بارگذاری/تبدیل فیلدها) برای پروژهٔ شما بنویسم.





