حول المحتوى:
مكتبة Requests هي واحدة من أشهر المكتبات في Python التي تُستخدم للتعامل مع بروتوكولات الإنترنت، وبشكل خاص لإرسال واستقبال طلبات HTTP و HTTPS. إنها مكتبة مفتوحة المصدر وسهلة الاستخدام.
إذا كنت مطورًا بلغة بايثون وترغب في تنفيذ طلبات HTTP بسهولة وسلاسة، فإن مكتبة Requests هي الخيار الأمثل لك. تُعد مكتبة Requests واحدة من أكثر المكتبات شيوعًا في لغة Python بفضل بساطتها وقوتها في إرسال واستقبال البيانات عبر الإنترنت. سواء كنت ترغب في إرسال طلب GET لجلب البيانات من واجهة برمجية (API)، أو تحتاج إلى إرسال طلب POST لتحميل البيانات، فإن Requests توفر لك الأدوات التي تحتاجها بكل احترافية.
في هذا المقال، سنتعرف على كيفية تثبيت مكتبة Requests واستخدامها في تنفيذ العمليات الأساسية والمتقدمة مثل: إرسال الطلبات، تمرير المعاملات عبر عناوين URL، إدارة المحتوى النصي والثنائي، والتعامل مع الاستجابات بصيغة JSON. كما سنغطي موضوعات هامة مثل: إعداد الترويسات المخصصة، إرسال ملفات متعددة الأجزاء، إدارة الكوكيز وإعادة التوجيه، بالإضافة إلى التعامل مع الأخطاء والاستثناءات وضبط فترات الانتظار (Timeouts).
سواء كنت مبتدئًا تبحث عن فهم أساسيات مكتبة Requests أو مطورًا محترفًا تتطلع إلى تحسين مهاراتك في التعامل مع الواجهات البرمجية (APIs)، فإن هذا الدليل سيأخذك خطوة بخطوة نحو احتراف استخدام هذه المكتبة الرائعة. تابع القراءة لاكتشاف المزيد عن قوة وسهولة مكتبة Requests في Python.
مكتبة Requests هي واحدة من أشهر المكتبات في Python التي تُستخدم للتعامل مع بروتوكولات الإنترنت، وبشكل خاص لإرسال واستقبال طلبات HTTP و HTTPS. إنها مكتبة مفتوحة المصدر وسهلة الاستخدام، تُسهل على المطورين التعامل مع الشبكات بشكل أكثر كفاءة ومرونة.
Requests هي مكتبة في Python تهدف إلى تبسيط عملية إرسال الطلبات إلى الخوادم عبر بروتوكول HTTP. يتيح لك استخدام هذه المكتبة إرسال طلبات GET، POST، PUT، DELETE، وغيرها، والحصول على الاستجابة من الخادم بسهولة. بالإضافة إلى ذلك، توفر المكتبة واجهة برمجية بسيطة للعديد من المهام المتعلقة بالشبكة مثل إضافة معلمات إلى URL، إرسال بيانات، تحميل الملفات، التعامل مع ملفات تعريف الارتباط (cookies)، والتعامل مع حالات إعادة التوجيه.
سهولة الاستخدام: مكتبة Requests بسيطة وسهلة الاستخدام مقارنة بالكود المعقد الذي يتطلبه التعامل مع HTTP باستخدام مكتبات أخرى مثل urllib
أو httplib
. هي توفر واجهة برمجية نظيفة وسهلة الفهم بحيث يمكن للمطورين إرسال الطلبات واستقبال الاستجابات بسرعة.
التعامل مع جميع أنواع الطلبات HTTP: سواء كنت بحاجة لإرسال طلب GET لاسترجاع البيانات من الخادم، أو طلب POST لإرسال البيانات، أو حتى إجراء طلبات معقدة مثل PUT و DELETE، توفر لك مكتبة Requests جميع الأدوات التي تحتاجها.
إدارة المعلمات والبيانات بسهولة: يمكن للمطورين بسهولة إضافة معلمات إلى URL باستخدام معلمة params
أو إرسال بيانات JSON أو نماذج باستخدام data
أو json
. تُسهل هذه الطريقة التعامل مع بيانات الاستمارات أو API.
دعم التعامل مع الاستجابات المتعددة: مكتبة Requests توفر لك إمكانيات التعامل مع استجابات مختلفة بسهولة، مثل النصوص العادية (text)، أو الاستجابات الثنائية (binary)، أو بيانات JSON، مما يجعلها مثالية عند التعامل مع APIs.
إعادة التوجيه التلقائي: تدير المكتبة عمليات إعادة التوجيه التلقائي عند تلقي رموز حالة HTTP مثل 301 أو 302، مما يعني أنك لا تحتاج للتعامل مع هذه العمليات يدويًا، مما يبسط من العملية بشكل كبير.
الدعم الكامل لملفات تعريف الارتباط (Cookies): يمكنك بسهولة إرسال واستقبال ملفات تعريف الارتباط في الطلبات، مما يسهل التعامل مع الجلسات (sessions) في التطبيقات التي تتطلب الاحتفاظ بحالة المستخدم.
إدارة المهلات والتعامل مع الاستثناءات: يمكن للمطورين تحديد المهلات (timeouts) لتجنب الانتظار طويلًا في حالة فشل الاتصال بالخادم. كما توفر مكتبة Requests آلية مدمجة للتعامل مع الأخطاء والاستثناءات مثل الأخطاء في الاتصال أو استجابات HTTP غير صحيحة.
دعم التأليف المتقدم (Advanced Features): تحتوي المكتبة أيضًا على ميزات متقدمة مثل دعم شهادات SSL، إضافة رؤوس مخصصة (Custom Headers)، وكذلك إرسال ملفات متعددة عبر POST باستخدام ترميز multipart/form-data
.
لتثبيت مكتبة Requests في بايثون، تحتاج أولاً إلى التأكد من أنك قمت بتثبيت Python ومُدير الحزم pip على جهازك. تُعتبر عملية التثبيت سهلة وبسيطة ويمكن إنجازها باستخدام سطر أوامر واحد فقط.
python -m pip install requests
بعد إكمال عملية التثبيت، يمكنك التحقق من نجاح التثبيت عن طريق تشغيل الأمر التالي:
python -c "import requests; print(requests.__version__)"
سيقوم هذا الأمر بعرض إصدار مكتبة Requests المثبتة على جهازك.
لتجنب مشاكل تعارض المكتبات في المشاريع المختلفة، يُفضل استخدام بيئة افتراضية (Virtual Environment). يمكنك إنشاء بيئة افتراضية وتثبيت مكتبة Requests بداخلها كالتالي:
قم بإنشاء بيئة افتراضية:
python -m venv myenv
فعّل البيئة الافتراضية:
myenv\Scripts\activate
source myenv/bin/activate
قم بتثبيت مكتبة Requests داخل البيئة الافتراضية:
python -m pip install requests
إذا واجهت مشكلة أثناء التثبيت، تأكد من تحديث pip إلى أحدث إصدار:
python -m pip install --upgrade pip
إذا كنت تستخدم Python 3، تأكد من أن الأمر يشير إلى الإصدار الصحيح:
python3 -m pip install requests
الآن أصبحت مكتبة Requests جاهزة للاستخدام في مشاريعك.
مكتبة Requests تجعل عملية إرسال طلبات HTTP في بايثون أمرًا بسيطًا للغاية. يمكنك إرسال طلبات GET وPOST بسهولة للحصول على البيانات أو إرسالها إلى خوادم الويب أو الواجهات البرمجية (APIs).
لإرسال طلب GET، كل ما تحتاجه هو استدعاء دالة requests.get()
وتمرير الرابط الخاص بالموارد التي تريد الوصول إليها.
import requests
# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')
# عرض المحتوى النصي للاستجابة
print(response.text)
لإرسال طلب POST، يمكنك استخدام دالة requests.post()
وتمرير البيانات التي تريد إرسالها كمعامل.
# إرسال طلب POST مع بيانات
data = {'title': 'foo', 'body': 'bar', 'userId': 1}
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
# عرض استجابة الطلب
print(response.json())
requests.get()
و requests.post()
: تُستخدم لإرسال طلبات HTTP من نوع GET وPOST.response
: يمثل استجابة الخادم لطلبك.response.text
: يعرض المحتوى النصي للاستجابة.response.json()
: يقوم بتحويل استجابة JSON إلى كائن Python (قاموس).للتأكد من نجاح الطلب، يمكنك استخدام رمز الحالة (Status Code).
if response.status_code == 200:
print("الطلب ناجح!")
else:
print(f"حدث خطأ: {response.status_code}")
في كثير من الحالات، تحتاج إلى إرسال معاملات (Parameters) مع طلبات HTTP، خاصة عند التعامل مع واجهات برمجية (APIs). تُتيح مكتبة Requests إمكانية تمرير المعاملات بسهولة باستخدام المعامل params
مع دالة requests.get()
.
import requests
# الرابط مع تمرير معاملات
url = 'https://jsonplaceholder.typicode.com/comments'
params = {'postId': 1}
# إرسال طلب GET مع معاملات
response = requests.get(url, params=params)
# عرض المحتوى النصي للاستجابة
print(response.text)
params
:
كائن قاموسي (Dictionary) يحتوي على المعاملات التي سيتم إضافتها إلى الرابط.
المثال أعلاه يعادل طلبًا على الشكل التالي:
https://jsonplaceholder.typicode.com/comments?postId=1
response.text
:
يعرض البيانات التي تم جلبها من الخادم كالنص.
يمكنك تمرير أكثر من معامل بسهولة عن طريق إضافتها إلى القاموس:
params = {'postId': 1, 'id': 5}
response = requests.get(url, params=params)
print(response.url) # عرض الرابط الناتج
سيُظهر الرابط الناتج:
https://jsonplaceholder.typicode.com/comments?postId=1&id=5
تدعم مكتبة Requests جميع أنواع طلبات HTTP الشائعة، مما يجعلها أداة مرنة للتفاعل مع الخوادم والواجهات البرمجية (APIs). إليك نظرة عامة على أهم أنواع الطلبات:
response = requests.get('https://example.com/data')
data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://example.com/login', data=data)
data = {'title': 'Updated Title'}
response = requests.put('https://example.com/posts/1', json=data)
data = {'title': 'Partially Updated Title'}
response = requests.patch('https://example.com/posts/1', json=data)
response = requests.delete('https://example.com/posts/1')
# طلب HEAD
response = requests.head('https://example.com')
# طلب OPTIONS
response = requests.options('https://example.com')
عند إرسال طلب HTTP باستخدام مكتبة Requests، تكون النتيجة استجابة (Response) تحتوي على معلومات مهمة. تُتيح مكتبة Requests طرقًا متعددة للوصول إلى محتوى هذه الاستجابة، سواء كانت نصوصًا، بيانات JSON، أو محتوى ثنائي.
إذا كانت الاستجابة تحتوي على نص (مثل HTML أو نصوص خام)، يمكنك استخدام الخاصية text
للحصول على محتوى النص.
import requests
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
# عرض المحتوى النصي للاستجابة
print(response.text)
إذا كانت الاستجابة تحتوي على بيانات بصيغة JSON، يمكنك استخدام الدالة json()
لتحويلها إلى كائن Python (مثل القواميس والقوائم).
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
# تحويل الاستجابة إلى JSON
data = response.json()
# عرض البيانات
print(data['title']) # طباعة عنوان المنشور
يمكنك استخدام الخاصية content
للحصول على المحتوى في صورة ثنائية (Binary) مفيد عند التعامل مع ملفات مثل الصور أو ملفات PDF.
response = requests.get('https://via.placeholder.com/150')
# حفظ صورة من المحتوى الثنائي
with open('image.png', 'wb') as file:
file.write(response.content)
إذا كنت بحاجة إلى الوصول إلى المحتوى بشكل خام (Raw)، يمكنك استخدام الخاصية raw
. يتطلب ذلك قراءة البيانات يدويًا.
response = requests.get('https://jsonplaceholder.typicode.com/posts/1', stream=True)
# قراءة المحتوى الخام
print(response.raw.read(10)) # قراءة أول 10 بايتات
Requests تحاول تخمين ترميز المحتوى تلقائيًا، ويمكنك الوصول إلى الترميز باستخدام الخاصية encoding
أو تغييره يدويًا.
response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
# عرض الترميز الافتراضي
print(response.encoding)
# تغيير الترميز
response.encoding = 'utf-8'
response.json()
فقط إذا كنت واثقًا من أن البيانات بتنسيق JSON، وإلا ستُثار استثناءات.في بعض الأحيان، تحتاج إلى إرسال ترويسات مخصصة (Custom Headers) مع طلبات HTTP. تُعتبر الترويسات وسيلة لتزويد الخادم بمعلومات إضافية حول الطلب، مثل بيانات المصادقة (Authentication) أو نوع المحتوى. مكتبة Requests تتيح إضافة الترويسات بسهولة باستخدام المعامل headers
.
لإرسال ترويسات مخصصة، قم بتمرير قاموس (Dictionary) يحتوي على أسماء الترويسات وقيمها إلى المعامل headers
.
import requests
# تعريف الترويسات المخصصة
headers = {
'User-Agent': 'my-app/1.0',
'Accept': 'application/json'
}
# إرسال طلب GET مع الترويسات
response = requests.get('https://jsonplaceholder.typicode.com/posts', headers=headers)
# عرض المحتوى النصي للاستجابة
print(response.text)
User-Agent
: يُستخدم لتحديد التطبيق أو العميل الذي يقوم بإرسال الطلب.Accept
: يُخبر الخادم بنوع المحتوى الذي يتوقعه العميل في الاستجابة.عند التعامل مع واجهات برمجية (APIs) تتطلب رموز الوصول (Tokens)، يمكن إرسالها ضمن الترويسات.
# تعريف الترويسات مع رمز مصادقة
headers = {
'Authorization': 'Bearer your_access_token'
}
response = requests.get('https://api.example.com/data', headers=headers)
# عرض استجابة الطلب
print(response.json())
يمكنك التأكد من الترويسات المرسلة باستخدام الخاصية request.headers
.
response = requests.get('https://jsonplaceholder.typicode.com/posts', headers=headers)
# عرض الترويسات المرسلة
print(response.request.headers)
مكتبة Requests تضيف بعض الترويسات الافتراضية، مثل User-Agent
و Accept-Encoding
. يمكنك تجاوزها بتحديد قيم مخصصة.
Content-Type
، تُضاف تلقائيًا عند استخدام الطلبات مثل POST و PUT بناءً على البيانات المرسلة.عند استخدام مكتبة Requests، يُمكنك تنفيذ طلبات POST لإرسال بيانات معقدة، سواء كانت في صورة نصوص، قواميس JSON، ملفات، أو حتى إعدادات متقدمة مثل البيانات المشفرة. إليك كيفية التعامل مع طلبات POST المعقدة:
تُسهّل مكتبة Requests إرسال البيانات بصيغة JSON باستخدام المعامل json
. يتم تحويل القاموس إلى JSON تلقائيًا.
import requests
# بيانات بصيغة JSON
data = {'name': 'John Doe', 'email': '[email protected]'}
# إرسال طلب POST
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
# عرض استجابة الطلب
print(response.json())
يمكنك استخدام المعامل data
لإرسال البيانات النصية أو النموذجية عبر جسم الطلب (Body).
# إرسال بيانات النموذج
data = {'username': 'user123', 'password': 'mypassword'}
response = requests.post('https://example.com/login', data=data)
# عرض استجابة الطلب
print(response.text)
إذا كنت بحاجة إلى إرسال ملفات، مثل الصور أو المستندات، يمكنك استخدام المعامل files
.
# إرسال ملف
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://example.com/upload', files=files)
# عرض استجابة الطلب
print(response.text)
في بعض الحالات، تحتاج إلى إرسال بيانات وملفات معًا، ويمكن القيام بذلك بسهولة:
data = {'title': 'My Document'}
files = {'file': open('example.pdf', 'rb')}
response = requests.post('https://example.com/upload', data=data, files=files)
# عرض استجابة الطلب
print(response.status_code)
يمكنك تمرير ترويسات مخصصة مع طلبات POST، كما هو الحال مع طلبات GET.
headers = {'Authorization': 'Bearer your_access_token'}
data = {'content': 'This is a test'}
response = requests.post('https://api.example.com/posts', headers=headers, json=data)
# عرض استجابة الطلب
print(response.json())
json
بدلاً من data
: إذا كنت ترسل بيانات بتنسيق JSON، فإن استخدام json
هو الطريقة الموصى بها.status_code
.عند التعامل مع واجهات برمجية (APIs) تتطلب رفع ملفات متعددة الأجزاء (Multipart-Encoded Files)، تُعد مكتبة Requests أداة مثالية لإتمام هذه العملية بسهولة.
يمكنك إرسال ملف واحد باستخدام المعامل files
. يتم ذلك عبر تمرير ملف مفتوح في الوضع الثنائي ('rb'
).
import requests
# رفع ملف بسيط
files = {'file': open('example.txt', 'rb')}
response = requests.post('https://example.com/upload', files=files)
# عرض استجابة الطلب
print(response.text)
لرفع أكثر من ملف في طلب واحد، قم بتمرير عدة عناصر في القاموس files
.
# رفع ملفات متعددة
files = {
'file1': open('example1.txt', 'rb'),
'file2': open('example2.txt', 'rb')
}
response = requests.post('https://example.com/multi-upload', files=files)
# عرض استجابة الطلب
print(response.status_code)
إذا كنت بحاجة إلى إرسال بيانات وملفات في نفس الطلب، يمكن دمج المعاملين data
و files
.
# إرسال بيانات وملفات
data = {'description': 'This is an example upload'}
files = {'file': open('example.pdf', 'rb')}
response = requests.post('https://example.com/upload', data=data, files=files)
# عرض استجابة الطلب
print(response.json())
لإرسال ملفات بصيغ متعددة مثل الصور أو مقاطع الفيديو، تأكد من أن الخادم يدعم تنسيق الملف، حيث تقوم مكتبة Requests بتعيين نوع الملف تلقائيًا.
files = {'image': open('example.jpg', 'rb')}
response = requests.post('https://example.com/image-upload', files=files)
# عرض الاستجابة
print(response.text)
استخدم رموز الحالة (status_code
) للتأكد من نجاح العملية.
if response.status_code == 200:
print("تم رفع الملف بنجاح!")
else:
print(f"حدث خطأ أثناء رفع الملف: {response.status_code}")
إغلاق الملفات:
لتجنب تسرب الموارد، تأكد من إغلاق الملفات بعد استخدامها:
with open('example.txt', 'rb') as file:
response = requests.post('https://example.com/upload', files={'file': file})
تحديد نوع البيانات:
إذا تطلب الخادم تحديد نوع MIME، يمكنك تمريرها مع الملف:
files = {'file': ('example.txt', open('example.txt', 'rb'), 'text/plain')}
عند إرسال أي طلب HTTP باستخدام مكتبة Requests، تتلقى استجابة تحتوي على رمز حالة (Status Code) يشير إلى نتيجة الطلب. أكواد الحالة هذه تُستخدم لتحديد ما إذا كانت العملية ناجحة أو إذا كان هناك خطأ ما. أكواد الحالة تندرج ضمن مجموعات مختلفة وفقًا للنوع. إليك أهم أكواد الحالة التي قد تواجهها أثناء العمل مع مكتبة Requests:
تدل أكواد الحالة في هذه الفئة على أن الطلب تم بنجاح.
200 OK:
هذا هو الرمز الأكثر شيوعًا، ويعني أن الطلب تم بنجاح وأن الخادم أعاد استجابة تحتوي على البيانات المطلوبة.
if response.status_code == 200:
print("الطلب ناجح!")
201 Created:
يشير إلى أن الموارد تم إنشاؤها بنجاح، وعادة ما يُستخدم عند إرسال طلبات POST.
if response.status_code == 201:
print("تم إنشاء المورد بنجاح!")
204 No Content:
يعني أن الطلب تم بنجاح ولكن لا توجد بيانات لإرجاعها (غالبًا ما يُستخدم مع طلبات DELETE).
تشير هذه الأكواد إلى أن هناك إعادة توجيه (Redirection) للطلب، ويجب على العميل إجراء خطوة إضافية.
301 Moved Permanently:
يشير إلى أن المورد قد تم نقله إلى الرابط جديد بشكل دائم.
302 Found:
يشير إلى أن المورد تم نقله مؤقتًا إلى الرابط جديد.
303 See Other:
يشير إلى أن العميل يجب أن يقوم بإرسال طلب آخر باستخدام طريقة GET لاسترداد المورد من الرابط آخر.
307 Temporary Redirect:
يشير إلى أن العميل يجب أن يعيد إرسال نفس الطلب إلى الرابط آخر.
تشير أكواد الحالة في هذه الفئة إلى أن العميل قام بإرسال طلب غير صحيح أو يحتوي على خطأ.
400 Bad Request:
يعني أن الطلب غير صحيح أو يحتوي على أخطاء في البيانات المرسلة.
if response.status_code == 400:
print("الطلب غير صحيح!")
401 Unauthorized:
يشير إلى أن العميل لم يقدم بيانات المصادقة الصحيحة للوصول إلى المورد.
if response.status_code == 401:
print("لم يتم المصادقة!")
403 Forbidden:
يعني أن العميل ليس لديه الإذن للوصول إلى المورد، حتى لو كانت بيانات المصادقة صحيحة.
if response.status_code == 403:
print("النفاذ إلى المورد محظور!")
404 Not Found:
يشير إلى أن المورد المطلوب غير موجود على الخادم.
if response.status_code == 404:
print("المورد غير موجود!")
تشير هذه الأكواد إلى أن هناك خطأ على الخادم أثناء معالجة الطلب.
500 Internal Server Error:
يعني أن هناك خطأ غير متوقع على الخادم.
502 Bad Gateway:
يعني أن الخادم الذي يعمل كبوابة (Gateway) تلقى استجابة غير صالحة من الخادم المساعد.
503 Service Unavailable:
يشير إلى أن الخدمة غير متاحة حاليًا بسبب صيانة أو مشكلة على الخادم.
504 Gateway Timeout:
يعني أن الخادم الذي يعمل كبوابة (Gateway) لم يتلقَ استجابة في الوقت المحدد من الخادم المساعد.
يمكنك التحقق من رمز الحالة في الاستجابة باستخدام الخاصية status_code
، واتخاذ الإجراءات المناسبة بناءً على ذلك:
if response.status_code == 200:
print("الطلب ناجح!")
elif response.status_code == 404:
print("المورد غير موجود!")
else:
print(f"خطأ في الطلب: {response.status_code}")
رؤوس الاستجابة (Response Headers) هي معلومات إضافية يتم إرسالها مع استجابة HTTP، وتحتوي على تفاصيل حول كيفية معالجة الطلب أو نوع المحتوى المرسل. يمكن أن تشمل هذه الرؤوس معلومات مثل نوع المحتوى، وتاريخ الاستجابة، وأذونات الوصول، وغيرها من المعلومات المتعلقة بالاستجابة.
يمكنك الوصول إلى رؤوس الاستجابة عبر الخاصية headers
في الكائن response. يقوم هذا الكائن بإرجاع قاموس يحتوي على كل الرؤوس المرسلة مع الاستجابة.
import requests
# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')
# عرض رؤوس الاستجابة
print(response.headers)
# الوصول إلى رأس معين
content_type = response.headers.get('Content-Type')
print("نوع المحتوى:", content_type)
Content-Type: يُستخدم للإشارة إلى نوع البيانات التي يتم إرسالها في الاستجابة، مثل application/json
أو text/html
.
content_type = response.headers.get('Content-Type')
print("نوع المحتوى:", content_type)
Content-Length: يُحدد حجم المحتوى المرسل في الاستجابة بالبايت.
content_length = response.headers.get('Content-Length')
print("حجم المحتوى:", content_length)
Date: يُحدد تاريخ ووقت إرسال الاستجابة.
date = response.headers.get('Date')
print("تاريخ الاستجابة:", date)
Cache-Control: يُحدد سياسة التخزين المؤقت (caching) للاستجابة.
cache_control = response.headers.get('Cache-Control')
print("سياسة التخزين المؤقت:", cache_control)
Set-Cookie: يحتوي على معلومات عن ملفات تعريف الارتباط (Cookies) التي يمكن تخزينها على العميل.
cookies = response.headers.get('Set-Cookie')
print("ملفات تعريف الارتباط:", cookies)
عند إرسال أو استقبال ملفات تعريف الارتباط، يمكنك الوصول إليها باستخدام الخاصية cookies
في الكائن response. تكون هذه الخاصية عبارة عن قاموس يحتوي على جميع ملفات تعريف الارتباط التي أرسلها الخادم مع الاستجابة.
# الوصول إلى ملفات تعريف الارتباط
cookies = response.cookies
print("ملفات تعريف الارتباط:", cookies)
يمكنك أيضًا تعديل رؤوس الطلب عند إرسال طلب HTTP، وذلك باستخدام المعامل headers
. على سبيل المثال، لتحديد نوع المحتوى الذي سيستقبله العميل أو لتضمين رمز المصادقة.
headers = {
'Authorization': 'Bearer your_access_token',
'Accept': 'application/json'
}
response = requests.get('https://api.example.com/data', headers=headers)
print(response.status_code)
headers
بشكل صحيح عند التعامل مع APIs التي تتطلب مصادقة أو معلومات مخصصة.ملفات تعريف الارتباط (Cookies) هي ملفات صغيرة يتم تخزينها على جهاز العميل (مثل المتصفح) تحتوي على معلومات عن الجلسة أو تفضيلات المستخدم. يستخدمها الخادم لتتبع حالة المستخدم بين الطلبات، مثل تتبع عمليات تسجيل الدخول أو تخزين تفضيلات المستخدم.
مكتبة Requests توفر طريقة بسيطة للوصول إلى ملفات تعريف الارتباط التي تم إرسالها من الخادم مع الاستجابة. يتم تخزين ملفات تعريف الارتباط في الخاصية cookies
للكائن response. وهي تكون عبارة عن قاموس يمكن الوصول إليه كما في المثال التالي:
import requests
# إرسال طلب GET
response = requests.get('https://jsonplaceholder.typicode.com/posts')
# الوصول إلى ملفات تعريف الارتباط
cookies = response.cookies
print("ملفات تعريف الارتباط:", cookies)
إذا كنت بحاجة إلى إرسال ملفات تعريف الارتباط مع الطلبات، يمكنك استخدام المعامل cookies
في مكتبة Requests. يُمكنك تمرير قاموس يحتوي على اسم ملف تعريف الارتباط وقيمته، وسيتم إرفاق هذه الملفات مع الطلب:
# إرسال طلب GET مع ملفات تعريف الارتباط
cookies = {'session_id': '123456789'}
response = requests.get('https://example.com/dashboard', cookies=cookies)
# عرض الاستجابة
print(response.text)
تُستخدم ملفات تعريف الارتباط بشكل شائع في عمليات المصادقة (مثل تسجيل الدخول)، حيث يقوم الخادم بإرسال ملف تعريف ارتباط خاص بالجلسة عند تسجيل الدخول بنجاح، ويتم استخدام هذا الملف في الطلبات اللاحقة لتحديد هوية المستخدم.
# إرسال طلب POST لتسجيل الدخول
login_data = {'username': 'user', 'password': 'pass'}
response = requests.post('https://example.com/login', data=login_data)
# الوصول إلى ملفات تعريف الارتباط بعد تسجيل الدخول
cookies = response.cookies
print("ملفات تعريف الارتباط بعد تسجيل الدخول:", cookies)
# إرسال طلب آخر مع ملفات تعريف الارتباط
response = requests.get('https://example.com/profile', cookies=cookies)
print(response.text)
يمكنك استخدام ملفات تعريف الارتباط لاستمرار الجلسات بين الطلبات المتعددة. على سبيل المثال، إذا كنت تعمل مع API يتطلب الجلسة، يمكنك إرسال ملفات تعريف الارتباط مع كل طلب بعد تسجيل الدخول:
# إرسال ملفات تعريف الارتباط مع طلب GET
cookies = {'session_id': 'abcdef123456'}
response = requests.get('https://example.com/user-data', cookies=cookies)
print(response.json())
requests.Session()
مكتبة Requests توفر أيضًا كائن Session
، الذي يُستخدم لإدارة ملفات تعريف الارتباط تلقائيًا بين الطلبات المتعددة ضمن نفس الجلسة.
# إنشاء جلسة جديدة
session = requests.Session()
# إرسال طلب تسجيل الدخول (يتم تخزين ملفات تعريف الارتباط تلقائيًا)
session.post('https://example.com/login', data={'username': 'user', 'password': 'pass'})
# إرسال طلب آخر باستخدام نفس الجلسة
response = session.get('https://example.com/dashboard')
print(response.text)
requests.Session()
يمكن أن يسهل التعامل مع الجلسات طويلة الأمد وإدارة ملفات تعريف الارتباط بشكل أفضل.إعادة التوجيه هي عملية يتم فيها توجيه العميل (مثل المتصفح أو مكتبة Requests) إلى الرابط جديد بعد إجراء طلب. تحدث عادةً عندما يتم نقل المورد إلى مكان آخر (بشكل دائم أو مؤقت). يمكن أن تكون هذه العملية مؤتمتة أو تتطلب من العميل اتخاذ خطوة إضافية.
مكتبة Requests تدير عملية إعادة التوجيه تلقائيًا وتخزن معلومات حول التاريخ (History) الذي يوضح جميع مراحل إعادة التوجيه.
عند إرسال طلب باستخدام مكتبة Requests، قد تتلقى استجابة مع رمز حالة يشير إلى إعادة توجيه (مثل 301 أو 302). بشكل افتراضي، يقوم Requests بمعالجة عمليات إعادة التوجيه تلقائيًا ومتابعة الرابط الجديد. لكن إذا كنت ترغب في تعطيل هذه الميزة، يمكنك تحديد ذلك باستخدام المعامل allow_redirects=False
.
# تعطيل إعادة التوجيه التلقائي
response = requests.get('https://httpbin.org/redirect/3', allow_redirects=False)
# عرض رمز الحالة
print(response.status_code) # سيظهر رمز حالة إعادة التوجيه مثل 301 أو 302
إذا كنت ترغب في معرفة كيف تمت عملية إعادة التوجيه، يمكنك الوصول إلى خاصية history
في الاستجابة. تحتوي هذه الخاصية على قائمة من الاستجابات التي تم اتباعها أثناء عملية إعادة التوجيه.
# طلب مع إعادة توجيه
response = requests.get('https://httpbin.org/redirect/3')
# عرض تاريخ عمليات إعادة التوجيه
for resp in response.history:
print(f"رمز الحالة: {resp.status_code}، URL: {resp.url}")
في بعض الأحيان، قد ترغب في تجنب المتابعة التلقائية للروابط أثناء إعادة التوجيه. يمكنك تعطيل ذلك باستخدام allow_redirects=False
، ثم معالجة العملية يدويًا حسب الحاجة.
response = requests.get('https://example.com/redirect', allow_redirects=False)
احترس من الحلقات اللانهائية في إعادة التوجيه، حيث قد يعيد الخادم توجيه العميل إلى نفس الرابط عدة مرات، مما يؤدي إلى خطأ Too Many Redirects
.
في بعض الحالات، قد يكون لديك سلسلة من عمليات إعادة التوجيه، ولكنك تحتاج فقط إلى النتيجة النهائية بعد تنفيذ كل عمليات التوجيه. يمكنك الوصول إلى الاستجابة النهائية من خلال الخاصية response
مباشرة.
# الوصول إلى الاستجابة النهائية بعد إعادة التوجيه
final_response = response
print("الاستجابة النهائية:", final_response.url)
history
للحصول على معلومات دقيقة حول كل خطوة من عملية التوجيه.المهلة (Timeout) هي الوقت الذي ينتظره العميل (مثل مكتبة Requests) للحصول على استجابة من الخادم قبل أن يعتبر الطلب فاشلاً. يعد تحديد المهلة جزءًا مهمًا من إدارة الطلبات HTTP، حيث يمكنك من التعامل مع المواقف التي قد يتأخر فيها الخادم أو يكون غير متاح.
تُستخدم المهلة لتجنب انتظار طويل قد يؤثر على أداء التطبيق أو يسبب تعطلًا في النظام.
يمكنك تحديد المهلة باستخدام المعامل timeout
عند إرسال الطلب. قيمة المهلة تُقاس بالثواني، وتحديدها يساعد في ضبط الوقت الذي ينتظره البرنامج قبل أن ينتهي.
import requests
try:
# إرسال طلب GET مع مهلة
response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
print("الاستجابة:", response.text)
except requests.exceptions.Timeout:
print("انتهت المهلة قبل الحصول على استجابة من الخادم")
في المثال أعلاه، إذا لم يحصل العميل على استجابة خلال 5 ثوانٍ، سيتم رفع استثناء من نوع Timeout
.
تسمح لك مكتبة Requests بتحديد مهلتين مختلفتين:
يمكنك تحديد كلا المهلتين باستخدام timeout
كزوج من القيم: الأولى لمهلة الاتصال والثانية لمهلة القراءة.
import requests
try:
# تحديد مهلة الاتصال ومهلة القراءة
response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=(3, 7))
print("الاستجابة:", response.text)
except requests.exceptions.Timeout:
print("انتهت المهلة قبل الحصول على استجابة من الخادم")
في هذا المثال:
3
ثوانٍ هي مهلة الاتصال.7
ثوانٍ هي مهلة القراءة.إذا انتهت المهلة قبل أن يتمكن العميل من الحصول على استجابة، سترتفع استثناءات مختلفة بناءً على نوع الخطأ:
requests.exceptions.Timeout
: يتم رفع هذا الاستثناء إذا تجاوز العميل الوقت المحدد دون الحصول على استجابة.requests.exceptions.ConnectTimeout
: يتم رفعه عندما يتجاوز وقت الاتصال بالخادم.requests.exceptions.ReadTimeout
: يتم رفعه عندما يتجاوز وقت انتظار البيانات بعد الاتصال بالخادم.يمكنك التعامل مع هذه الاستثناءات لضمان أن تطبيقك لن يتوقف عن العمل في حالة حدوث مشكلة في الاتصال أو التأخير في استجابة الخادم:
import requests
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
print(response.text)
except requests.exceptions.Timeout:
print("لقد انتهت المهلة!")
except requests.exceptions.RequestException as e:
print(f"حدث خطأ: {e}")
عند العمل مع مكتبة Requests أو أي مكتبة شبكة أخرى، من الضروري أن تكون قادرًا على التعامل مع الأخطاء والاستثناءات. يمكن أن تحدث العديد من المشكلات أثناء إرسال واستقبال الطلبات HTTP، مثل مشكلات الاتصال أو أخطاء في الخادم، لذا يجب أن يكون لديك آلية للتعامل مع هذه الحالات بطريقة مناسبة.
requests.exceptions.Timeout
:
timeout
، وإذا استغرق الطلب وقتًا أطول من المهلة المحددة، يتم رفع هذا الاستثناء.try:
response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=3)
except requests.exceptions.Timeout:
print("انتهت المهلة قبل أن يتمكن الخادم من الاستجابة")
requests.exceptions.RequestException
:
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts')
except requests.exceptions.RequestException as e:
print(f"حدث خطأ في الطلب: {e}")
requests.exceptions.HTTPError
:
404 Not Found
أو 500 Internal Server Error
.response.raise_for_status()
للتحقق من وجود خطأ في الاستجابة.response = requests.get('https://jsonplaceholder.typicode.com/invalid_url')
try:
response.raise_for_status() # سيرتفع الاستثناء إذا كانت الاستجابة غير ناجحة
except requests.exceptions.HTTPError as err:
print(f"حدث خطأ في الاستجابة: {err}")
requests.exceptions.ConnectionError
:
try:
response = requests.get('https://nonexistentdomain.com')
except requests.exceptions.ConnectionError:
print("لا يمكن الاتصال بالخادم، تحقق من الاتصال بالإنترنت")
requests.exceptions.TooManyRedirects
:
try:
response = requests.get('https://httpbin.org/redirect/10')
except requests.exceptions.TooManyRedirects:
print("تجاوز عدد عمليات إعادة التوجيه المسموح بها")
requests.exceptions.URLRequired
:
try:
response = requests.get('')
except requests.exceptions.URLRequired:
print("يرجى تقديم رابط صالح")
requests.exceptions.InvalidURL
:
try:
response = requests.get('http://example.com')
except requests.exceptions.InvalidURL:
print("الرابط غير صالح")
try
و except
عند إرسال الطلبات، من الأفضل دائمًا وضع الكود داخل كتلة try
و except
للتعامل مع الأخطاء والاستثناءات بشكل مناسب. على سبيل المثال، يمكنك التحقق من وجود أخطاء HTTP، مشاكل في الاتصال، أو تجاوز المهلة.
try:
response = requests.get('https://jsonplaceholder.typicode.com/posts', timeout=5)
response.raise_for_status() # تحقق من الأخطاء في الاستجابة
print(response.text)
except requests.exceptions.Timeout:
print("انتهت المهلة!")
except requests.exceptions.HTTPError as e:
print(f"خطأ HTTP: {e}")
except requests.exceptions.RequestException as e:
print(f"حدث خطأ: {e}")
raise_for_status()
: استخدم هذه الطريقة للتحقق من أن استجابة الخادم كانت ناجحة (رمز حالة 200)، وإذا كانت الاستجابة تحتوي على رمز حالة خطأ، سيرتفع استثناء HTTPError
.مكتبة Requests هي أداة قوية وبسيطة للتعامل مع HTTP في Python، وتتيح لك إرسال واستقبال الطلبات بسهولة. باستخدام Requests، يمكنك القيام بعدة مهام متعلقة بالشبكات مثل إرسال طلبات GET وPOST، إضافة معلمات إلى URL، التعامل مع ملفات تعريف الارتباط، إدارة عمليات إعادة التوجيه، وضبط المهلات لمزيد من التحكم في عملية الاتصال.
pip
لتتمكن من استخدامها في مشروعك.requests.get()
و requests.post()
لإرسال الطلبات، ويمكنك إضافة معلمات أو بيانات إلى الطلبات.params
في مكتبة Requests.try
و except
.مكتبة Requests هي واحدة من أشهر المكتبات في Python التي تُستخدم للتعامل مع بروتوكولات الإنترنت، وبشكل خاص لإرسال واستقبال طلبات HTTP و HTTPS. إنها مكتبة مفتوحة المصدر وسهلة الاستخدام.
مساحة اعلانية
المكتبات في بايثون هي مجموعات من الوحدات والحزم التي توفر أكواد مكتوبة مسبقًا لتنفيذ مهام مختلفة. تساعد في تبسيط عملية البرمجة من خلال توفير دوال وفئات قابلة لإعادة الاستخدام لوظائف محددة، مثل تحليل البيانات، تعلم الآلة، تطوير الويب، والمزيد.