کوکی HTTP (یا HTTP Cookie یا کوکی وب – کوکی مرورگر وب) قطعه های کوچکی از داده ها هستند که توسط وب سرور به مرورگر وب فرستاده می شوند و مرورگر وب آنها را درون خود ذخیره می کند تا در زمانی دیگر و در پاسخ به درخواست وب سرور، این کوکی ها مجدد از مرورگر وب به وب سرور فرستاده شوند. شکل زیر روند (مکانیزم) به کار گیری و کاربرد کوکی ها را برنامه نویسی وب (مانند ایجاد سایت ها) را نشان می دهد.

کوکی ها در سمت کلاینت (درخواست کننده) ذخیره می شوند که به طور معمول برنامه درخواست کننده معمولا مرورگرهای وب هستند ولی می تواند برنامه های دیگری که خودمان نوشته ایم کوکی ها را ذخیره کنند. چیزی که مهم است این که، در برنامه نویسی وب، زمانی که برنامه سمت کلاینت به وب سرور درخواستی را می فرستد، وب سرور شاید کوکی هایی را که شامل داده های کوچکی هستند را به کلاینت می فرستد و کلاینت آن را ذخیره کرده و در درخواست بعدی کلاینت از وب سرور، این کوکی نیز مجدد به وب سرور فرستاده می شود.

در برنامه نویسی وب و شبکه کوکی ها نقش مهمی را دارند. به طور نمونه از آنها می توانیم برای نگهداری داده های یک جلسه (Session) استفاده کنیم ولی این کار پیش نهاد نمی شود زیرا کوکی ها (Cookies) نسبت به جلسه ها (Sessions) امنیت کمتری دارند. توجه کنید که از کوکی ها برای نگهداریهر داده ای استفاده می شود که نیاز داریم آن را در درخواست بعدی یادآوری (Remember) کنیم. از کوکی ها می توانیم برای نگهداری داده ها و تنظیمات شخصی سازی استفاده کنیم. به طور مثال سایت به شما اجازه می دهد تا رنگ متفاوتی را برای غالب سایت نگهداری کنید به طوری که در بازدید بعدی همان رنگی که شما انتخاب کرده بودید نمایش داده شود، پس لازم است تا رنگ درون یک کوکی در مرورگر وب شما نگهداری شود تا در درخواست بعدی از همان مرورگر به وب سرور (سایت) فرستاده شود.

ایجاد کوکی HTTP در پایتون ۳ با http.cookiejar

در این مطلب می خواهیم توسط ماژول http.cookiejar در پایتون ۳ کوکی ها را ایجاد کنید. ماژول http.cookiejar دارای کلاس هایی است که اجازه می دهد تا بتوانیم کوکی ها را در سمت کلاینت را ایجاد کنیم. توجه کنید که در پایتون ۲ این کتابخانه، cookielib نامیده می شود. ماژول urllib.request برای دسترسی به وب سایت و خواندن آن است و می توان از ماژول http.cookiejar همراه با آن برنامه های وب بنویسیم که می توانند کوکی ها را ایجاد و اداره کنند.

کلاس CookieJar مهم ترین و اصلی ترین کلاس است که توسط آن کوکی های ذخیره می شوند، کوکی ها از درخواست های HTTP واکشی می شوند و در پایان کوکی را به عنوان پاسخ به سرور می فرستد. همچنین از این کلاس برای ذخیره سازیو بارگذاری داده های کوکی از یک فایل یا پایگاه داده استفاده می شود. البته به صورت پیش فرض کوکی ها درون حافظه اصلی ذخیره می شوند. در واقع متغیر یا شی که از کلاس CookieJar برای ذخیره سازی  کوکی استفاده می شود.

همانطور که گفتیم کوکی ها درون شی (نمونه – Instance) کلاس CookieJar ذخیره می شوند، بنابراین آنها به صورت پیش فرض در حافظه قرار دارند و پس از پایان یافتن و از میان رفتن نمونه، و پس از پاک سازی حافظه، این متغیر و به طبع کوکی از میان می روند. برای جلوگیری از این مشکل، کلاس FileCookieJar وجود دارد.

از کلاس FileCookieJar برای ذخیره سازی کوکی ها به درون فایل و واکشی آنها از درون فایل استفاده می شود. به عبارت دیگر کوکی ها درون دیسک ذخیره شده، پس ماندگاری آنها تضمین می شود. توجه کنید تابع سازنده کلاس CookieJar هیچ ورودی را نمی گیرد ولی تابع سازنده کلاس FileCookieJar حداقل نیاز به تعیین نام و مسیر فایلی بر روی دیسک دارد.

در http.cookiejar دو کلاس به نام های MozillaCookieJar و LWPCookieJar وجود دارند که از آنها می توانیم به عنوان FileCookieJar بری ذخیره سازی کوکی های روی دیسک استفاده کنیم. کلاس MozillaCookieJar کوکی ها را در یک فایل با فرمت استفاده شده در مرورگر موزیلا و Netscape ذخیره می کند. کلاس LWPCookieJar کوکی ها را بر روی دیسک و بر اساس فرمت استاندارد Set-Cookie3 ذخیره می کند.

ایجاد Opener (بازکننده) توسط ماژول urllib.request

در مطلب های پیشین چندین مورد زیر را در مورد کتابخانه urllib.request و کاربرد آن در برنامه نویسی وب و وب اسکرپینگ در پایتون را آموزش داده ایم. در این بخش می خواهیم ویژگی دیگری را آموزش دهیم که در کنار ماژول http.cookiejar در برنامه نویسی وب و وب اسکرپینگ کاربرد دارد. به طور معمول از متد ()urlopen برای باز کردن یک آدرس وب (URL) استفاده می کنیم اما در این مطلب می خواهیم روش دیگری را نشان دهیم.

۱ – برای خواندن محتوای صفحه وب از متد ()urllib.request.urlopen استفاده می شود.

۲ – از متد ()urllib.parse.urlparse برای پردازش آدرس وب استفاده می شود.

۳ – از کلاس Request که در مطلب  گفته شد برای آماده سازی یک درخواست HTTP استفاده می شود. در خواست HTTP چه مولفه هایی را نیاز دارد؟ ۱ – آدرس وبی که درخواست باید به آن فرستاده شود و ۲ – هدرهایی (Headers) مانند User Agent که نیاز است همراه درخواست فرستاده شوند.

۴ – در این مطلب می خواهیم نشان دهیم توسط متد ()urllib.request.build_opener یک آدرس وب را برای خوانده شدن باز کنیم.

ایجاد Opener (بازکننده) توسط ماژول urllib.request

در مطلب های پیشین چندین مورد زیر را در مورد کتابخانه urllib.request و کاربرد آن در برنامه نویسی وب و وب اسکرپینگ در پایتون را آموزش داده ایم. در این بخش می خواهیم ویژگی دیگری را آموزش دهیم که در کنار ماژول http.cookiejar در برنامه نویسی وب و وب اسکرپینگ کاربرد دارد. به طور معمول از متد ()urlopen برای باز کردن یک آدرس وب (URL) استفاده می کنیم اما در این مطلب می خواهیم روش دیگری را نشان دهیم.

۱ – برای خواندن محتوای صفحه وب از متد ()urllib.request.urlopen استفاده می شود.

۲ – از متد ()urllib.parse.urlparse برای پردازش آدرس وب استفاده می شود.

۳ – از کلاس Request که در مطلب  گفته شد برای آماده سازی یک درخواست HTTP استفاده می شود. در خواست HTTP چه مولفه هایی را نیاز دارد؟ ۱ – آدرس وبی که درخواست باید به آن فرستاده شود و ۲ – هدرهایی (Headers) مانند User Agent که نیاز است همراه درخواست فرستاده شوند.

۴ – در این مطلب می خواهیم نشان دهیم توسط متد ()urllib.request.build_opener یک آدرس وب را برای خوانده شدن باز کنیم.

در کنار Opener (باز کننده) مفهوم دیگری به نام Handler (اداره کننده) وجود دارد. Handler ها چگونگی رفتار با آدرس های وب برای هر کدام از اسکیماها را بر عهده دارند. به دو نمونه مطرح از اسکیما ها را می توانیم به http/https و ftp اشاره کنیم. به طور کلی اگر می خواهید برای اهدافی مانند ایجاد کوکی ها، آدرس وب را باز کنید، باید از یک Opener سفارشی ایجاد کنید که کوکی را اداره کند.

در کدهای بالا ابتدا کلاس های مورد نیاز را به فایل برنامه ضمیمه کرده ایم. کلاس HTTPCookieProcessor برای اداره کردن کوکی ها درون یک Opener استفاده می شود. در خط ۶ و توسط ()build_opener یک Opener سفارشی را در غالب متغیری به نام opener ایجاد کرده ایم. همانطور که می بینید این متد یک به عنوان ورودی یک کلاس اداره، که در اینجا HTTPCookieProcessor است را دریافت کرده است. متد ()build_opener یک نمونه از کلاس OpenerDirector را برگشت می دهد. بنابراین در خط ۹ و برای باز کردن و دریافت کوکی های سایت اینستاگرام، از متد ()open از کلاس OpenerDirector استفاده شده است.

توجه کنید که هم اکنون کوکی ها درون حافطه و در متغیر cj قرار دارند. متغیر cj در خط ۴ و از کلاس MozillaCookieJar ایجاد شده است، پس برای واکشی کوکی ها از حافظه و بارگذاری آن در فایلی به نام cookies.txt بر روی دیسک، در خط ۱۲ از متد ()save از کلاس MozillaCookieJar استفاده کرده ایم. در نهایت توسط خصوصیت filename از کلاس MozillaCookieJar می توانیم نام و مسیر فایلی را نمایش دهیم که توسط کلاس MozillaCookieJar برای نگهداری کوکی ها استفاده می شود. توجه کنید که در خط ۴ نام فایل به عنوان ورودی به تابع سازنده کلاس MozillaCookieJar فرستاده شده است. شکل زیر نمونه ای از محتوای فایل کوکی فرمت Netscape (یا Mozilla) را نشان می دهد.