مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون

مكتبة requests في البايثون هي أحد أشهر المكتبات التي تُستخدم في العديد من المشاريع الخاصة بالويب. تكاد لا تخلو أي مكتبة لها علاقة بالويب من استخدام هذه المكتبة الرائعة والمهمة، والتي تُسهل علينا التعامل مع بروتوكول الويب المشهور HTTP. أهلا بكم في بايثونات في هذا المقال الجديد الذي نتناول فيه مكتبة جديدة من مكتبات بايثون الرائعة.
أجرينا خلال الشهر السابق استطلاعًا للرأي، طلبنا فيه من جمهور بايثونات اختيار مكتبة بايثون من بين مجموعة من أشهر مكتبات بايثون. وحصلت فيه مكتبة requests على 40% من الأصوات. ونزولًا عند رغبة قراءِنا الأفاضل وجمهورنا العزيز، نقدم لكم هذا المقال.
عند نهاية هذا المقال، سنكون تعرفنا على:
- ما هي مكتبة requests ؟
- كيف نُثبت مكتبة requests ؟
- إرسال طلبات GET
- تفاصيل الرد Response
- تطبيق عملي على استخدام مكتبة requests
لنبدأ مقالنا على بركة الله.
ما هي مكتبة requests ؟
هي مكتبة في لُغة بايثون تُمكننا من التعامل مع بروتوكول HTTP بكل سهولة من حيث ارسال الطلبات requests واستقبال الردود وإجراء إعدادات متقدمة فيهما. بُنيت هذه المكتبة لتكون مألوفة للبشر كما يَذكر التوثيق الخاص بها:
Requests is an elegant and simple HTTP library for Python, built for human beings.
تتضمن المكتبة العديد من الخيارات والإمكانات التي تُساعدنا في إعداد روابط url وإسناد المعاملات لها، وتخصيص مكونات الطلب، مثل تحديد نوع البيانات المُرسلة أو التي يجب استقبالها، وتخصيص محتوى العناوين في الطلب headers إلى غير ذلك من الإعدادات.
كيف نُثبت مكتبة requests ؟
قبل تثبيت المكتبة نتأكد من تحديث مدير الحزم في بايثون pip عبر تنفيذ الأمر التالي في الطرفية:
[pastacode lang=”bash” manual=”pip%20install%20–upgrade%20pip” message=”” highlight=”” provider=”manual”/]
نتأكد من نُسخة pip المُحدثة من خلال الأمر التالي في الطرفية أيضًا:
[pastacode lang=”bash” manual=”pip%20–version” message=”” highlight=”” provider=”manual”/]
بعد أن انتهينا من تحديث مُدير الحزم، يُمكننا الأن تثبيت مكتبة requests من خلال مُدير الحزم باستخدام الأمر التالي في الطرفية:
[pastacode lang=”bash” manual=”python%20-m%20pip%20install%20requests” message=”” highlight=”” provider=”manual”/]
أنواع الطلبات في بروتوكول HTTP
كما ذكرنا في مقدمة المقال، فإن مكتبة requests هي مكتبة خاصة ببروتوكول HTTP، والذي هو عبارة عن بروتوكل لنقل البيانات بين جهتين، الأولى هي العميل client والثانية هي الخادم server. يُسمى البروتوكول بــ “بروتوكول نقل النص التشعبي Hyper Text Transfer Protocol“. الوظيفة الرئيسية للبروتوكول هي نقل البيانات بكافة أنواعها مثل النصوص، الملفات، الصور، الفيديو وغيره من أنواع البيانات.

الآلية الرئيسية لعمل البروتوكول تعتمد على مفهوم الطلب/الرد، وعليه يُوجد لدينا مجموعة من أنواع الطلبات التي يُمكن تحديدها في كُل طلب يتم ارساله للخادم. أنواع الطلبات هي كالتالي:
- GET
- HEAD
- POST
- PUT
- DELETE
- TRACE
- OPTIONS
- CONNECT
- PATCH
تُعتبر الطلبات من نوع GET و POST و PUT و DELETE هي الأكثر استخدمًا من الناحية العملية، مع وجود تطبيقات واستخدامات للأنواع الأخرى. لن نتطرق في هذا المقال إلى شرح البروتوكول وأنواع الطلبات المستخدمة فيه، ويُمكنكم الإطلاع أكثر على الموضوع من خلال المصادر التالية:
إرسال طلبات GET
أمر GET هو أحد أكثر طلبات HTTP شيوعًا، ويعني عند استخدامه هو أنك تطلب بيانات معينة من الخادم او الجهة التي تُرسل إليها الطلب. ببساطة، فإننا عندما نفتح المتصفح، ونكتب عنوان موقع بايثونات فيه ثم Enter، فهذا يعني أننا أرسلنا طلب GET من خلال بروتوكول HTTP إلى الخادم الذي يستضيف الموقع نطلب فيه بيانات الصفحة الرئيسية للموقع على شكل مستند Html. يتم إرجاع البيانات على شكل رد Response يتضمن البيانات التي طلبناها بالاضافة لمعلومات أخرى يستفيد منها المتصفح في عرض البيانات بطريقة صحيحة وآمنة.
لإرسال طلب GET من خلال البايثون، وعبر مكتبة requests، نستورد المكتبة في البداية، ثم نُعرف متغير باسم response ونُسند له القيمة المُرجعة من استدعاء دالة get في المكتبة:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse%20%3D%20re.get(‘https%3A%2F%2Fpythonat.com%2F’)%0A%0Aprint(type(response))%0A%23%20result%20%3D%3E%20%3Cclass%20’requests.models.Response’%3E%0A%0Aprint(response.status_code)%0A%23%20result%20%3D%3E%20200″ message=”” highlight=”” provider=”manual”/]
نُمرر للدالة get عنوان المصدر الخاص بالبيانات التي نطلبها على شكل url نصية. في المثال الأعلى، مررنا عنوان موقع بايثونات، ثم تعرفنا على نوع الرد والذي هو عبارة عن كائن من نوع <class ‘requests.models.Response’> وقمنا بطباعة حالة الرد والتي كانت 200 وتعني أن الطلب تم استقباله بنجاح وفهمه والرد عليه بنجاح.
من المهم التعرف على أكواد/أرقام الردود التي تكون موجودة في الرد. الرابط التالي يحتوي كافة أرقام الردود المستخدمة في بروتوكول HTTP:
تفاصيل الرد Response
في مثالنا السابق، استطعنا ارسال طلب GET للخادم الذي يستضيف موقع بايثونات، واستقبلنا الرد بنجاح، ولكن ما هي تفاصيل هذا الرد في البايثون؟ وما هي طبيعة البيانات الموجودة فيه؟
نستطيع التعرف أكثر على تفاصيل الرد من خلال التوابع الخاصة بالكائن من نوع Response، ونختصر أهمها في الجدول التالي:
[spbtbl_sc id=15]
محتوى Response
من خلال الجدول السابق، يُمكننا الحصول على البيانات المُرسلة في الرد وذلك من خلال عدة خصائص. الخاصية الأولى هي content:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse%20%3D%20re.get(‘https%3A%2F%2Fpythonat.com%2F’)%0A%0Aprint(response.content)%0A%0A%23%20result%20%3D%3E%20’%3C!DOCTYPE%20html%3E%20%3C!–%5Bif%20lt%20IE%207%5D%3E%3Chtml%20class%3D%22no-js%20lt-ie9%20lt-ie8%20lt-ie7%22%20dir%3D%22rtl%22%20lang%3D%22ar%22%3E%20……..” message=”” highlight=”” provider=”manual”/]
نتيجة تنفيذ الشيفرة البرمجية السابقة هي طباعة محتوى الرد الذي هو عبارة عن الصفحة الرئيسية لموقع بايثونات على شكل كود Html. لو غيرنا عنوان مصدر البيانات ليكون https://api.github.com بدلًا من https://pythonat.com/، ستكون البيانات المُرجعة عبارة عن بيانات json:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse%20%3D%20re.get(‘https%3A%2F%2Fapi.github.com%2F’)%0A%0Aprint(response.content)%0A%0A%23%20result%20%3D%3E%20b’%7B%5Cn%20%20%22current_user_url%22%3A%20%22https%3A%2F%2Fapi.github.com%2Fuser%22%2C%5Cn%20%20%22current_user_authorizations_html_url%22%3A……” message=”” highlight=”” provider=”manual”/]
اذا كانت البيانات المُرجعة في الرد على هيئة json، فيمكن حينها الحصول عليها بنفس النوع من خلال الدالة json كما يلي:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse%20%3D%20re.get(‘https%3A%2F%2Fapi.github.com%2F’)%0A%0Aprint(response.json())%0A%0A”’%20result%20%0A%7B’current_user_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser’%2C%0A%20’current_user_authorizations_html_url’%3A%20’https%3A%2F%2Fgithub.com%2Fsettings%2Fconnections%2Fapplications%7B%2Fclient_id%7D’%2C%0A%20’authorizations_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fauthorizations’%2C%0A%20’code_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Fcode%3Fq%3D%7Bquery%7D%7B%26page%2Cper_page%2Csort%2Corder%7D’%2C%0A%20’commit_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Fcommits%3Fq%3D%7Bquery%7D%7B%26page%2Cper_page%2Csort%2Corder%7D’%2C%0A%20’emails_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Femails’%2C%0A%20’emojis_url’%3A%20’https%3A%2F%2Fapi.github.com%2Femojis’%2C%0A%20’events_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fevents’%2C%0A%20’feeds_url’%3A%20’https%3A%2F%2Fapi.github.com%2Ffeeds’%2C%0A%20’followers_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Ffollowers’%2C%0A%20’following_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Ffollowing%7B%2Ftarget%7D’%2C%0A%20’gists_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fgists%7B%2Fgist_id%7D’%2C%0A%20’hub_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fhub’%2C%0A%20’issue_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Fissues%3Fq%3D%7Bquery%7D%7B%26page%2Cper_page%2Csort%2Corder%7D’%2C%0A%20’issues_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fissues’%2C%0A%20’keys_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Fkeys’%2C%0A%20’label_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Flabels%3Fq%3D%7Bquery%7D%26repository_id%3D%7Brepository_id%7D%7B%26page%2Cper_page%7D’%2C%0A%20’notifications_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fnotifications’%2C%0A%20’organization_url’%3A%20’https%3A%2F%2Fapi.github.com%2Forgs%2F%7Borg%7D’%2C%0A%20’organization_repositories_url’%3A%20’https%3A%2F%2Fapi.github.com%2Forgs%2F%7Borg%7D%2Frepos%7B%3Ftype%2Cpage%2Cper_page%2Csort%7D’%2C%0A%20’organization_teams_url’%3A%20’https%3A%2F%2Fapi.github.com%2Forgs%2F%7Borg%7D%2Fteams’%2C%0A%20’public_gists_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fgists%2Fpublic’%2C%0A%20’rate_limit_url’%3A%20’https%3A%2F%2Fapi.github.com%2Frate_limit’%2C%0A%20’repository_url’%3A%20’https%3A%2F%2Fapi.github.com%2Frepos%2F%7Bowner%7D%2F%7Brepo%7D’%2C%0A%20’repository_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Frepositories%3Fq%3D%7Bquery%7D%7B%26page%2Cper_page%2Csort%2Corder%7D’%2C%0A%20’current_user_repositories_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Frepos%7B%3Ftype%2Cpage%2Cper_page%2Csort%7D’%2C%0A%20’starred_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Fstarred%7B%2Fowner%7D%7B%2Frepo%7D’%2C%0A%20’starred_gists_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fgists%2Fstarred’%2C%0A%20’user_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fusers%2F%7Buser%7D’%2C%0A%20’user_organizations_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fuser%2Forgs’%2C%0A%20’user_repositories_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fusers%2F%7Buser%7D%2Frepos%7B%3Ftype%2Cpage%2Cper_page%2Csort%7D’%2C%0A%20’user_search_url’%3A%20’https%3A%2F%2Fapi.github.com%2Fsearch%2Fusers%3Fq%3D%7Bquery%7D%7B%26page%2Cper_page%2Csort%2Corder%7D’%7D%20%0A%20”'” message=”” highlight=”” provider=”manual”/]
على الأغلب، وفي البيئات التشغيلية الحقيقية، سنحتاج لمعرفة نوع البيانات قبل أن نتعامل معها، وقد نحتاج أيضًا إلى أن نُحدد نوع البيانات التي نُريد أن نستقبلها، فمثلا، قد نحتاج لبناء دالة او وظيفة تتعامل مع بيانات عبر الانترنت من خلال مكتبة requests وأن تكون نوع البيانات في الرد هي json وليست Html.
سنتمكن من معرفة نوع البيانات في الرد من خلال Headers الخاصة بالرد والتي سنتكلم عنها في العنوان القادم. لقراءة البيانات على شكل نصي نستخدم الخاصية text:
[pastacode lang=”python” manual=”print(response.text)” message=”” highlight=”” provider=”manual”/]
في بعض الأحيان، يكون الرد على الطلب عبارة عن خطأ، مثل الخطأ المشهور “الصفحة المطلوبة غير موجودة” والذي يُرمز له بالرمز 404. في هذه الحالة يُمكننا من خلال مكتبة requests التعرف على كود الرد من خلال الخاصية status_code:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse%20%3D%20re.get(‘https%3A%2F%2Fpythonat.com%2Fpage1%2F’)%0A%0Aif%20response.status_code%20%3D%3D%20200%3A%0A%09print(‘Request%20is%20successfully%20processed’)%0Aelif%20respose.status_code%20%3D%3D%20404%3A%0A%09print(‘The%20requested%20page%20not%20found’)%0Aelse%3A%0A%09print(‘Other%20error’)%0A%09print(response.status_code)%0A%09%0A%23%20result%20will%20be%20’The%20requested%20page%20not%20found’%20because%20there%20is%20no%20page1%20on%20pythonat.com” message=”” highlight=”” provider=”manual”/]
خاصية headers
تتضمن خاصية headers معلومات مهمة عن طبيعة الرد وطبيعة البيانات، وتكون نتيجة هذه الخاصية عبارة عن مجموعة من المفاتيح والقيم (مثل القاموس). يُمكننا من خلال خاصية headers التعرف على نوع البيانات في الرد، فمثلا، العناون الخاص بموقع بايثونات يُعيد رد من نوع text/html أما العنوان https://api.github.com فإنه يُعيد بيانات من نوع json:
[pastacode lang=”python” manual=”import%20requests%20as%20re%0A%0Aresponse1%20%3D%20re.get(‘https%3A%2F%2Fpythonat.com%2F’)%0A%0Aprint(response1.headers%5B’Content-Type’%5D)%0A%23%20result%20%3D%3E%20’text%2Fhtml%3B%20charset%3DUTF-8’%0A%0Aresponse2%20%3D%20re.get(‘https%3A%2F%2Fapi.github.com%2F’)%0A%0Aprint(response2.headers%5B’Content-Type’%5D)%0A%23%20result%20%3D%3E%20’application%2Fjson%3B%20charset%3Dutf-8’%0A” message=”” highlight=”” provider=”manual”/]
تطبيق عملي على استخدام مكتبة requests
بما أنه يُمكننا، برمجيًا، ارسال طلب لخادمٍ ما، ثم استقبال الرد ومعرفة تفاصيله من خلال مكتبة requests، فالمجال مفتوح أمامنا لتطبيق هذه الامكانية والاستفادة منها في العديد من التطبيقات، وحل الكثير من المشاكل والصعوبات التي نواجهها. في الجزء الأخير من هذا المقال، نعمل على استخدام مكتبة requests في جمع عناوين البريد الإلكتروني من صفحات مواقع معينة.
المثال هنا مشهور، وسوف نُبسطه للغاية، بحيث نقتصر ونوضح دور مكتبة requests. في البداية سنستورد المكتبات اللازمة للعمل وهي كالتالي:
[pastacode lang=”python” manual=”import%20requests%0Aimport%20re” message=”” highlight=”” provider=”manual”/]
مكتبة re هي مكتبة بايثون للتعابير النمطية regular expression وسنستخدمها للبحث عن نمط البريد الإلكتروني في الصفحات الموجودة لدينا.
نُعرف قائمة باسم pages تحتوي على روابط الصفحات في المواقع التي نُريد استخراج عناوين البريد الإلكتروني منها:
[pastacode lang=”python” manual=”pages%20%3D%20%5B%0A%20%20%20%20’http%3A%2F%2Fwww.pmdp.ps%2FListOfBusiness’%2C%0A%20%20%20%20’http%3A%2F%2Fwww.pmdp.ps%2Froster’%2C%0A%5D” message=”” highlight=”” provider=”manual”/]
نُعرف قائمة فارغة باسم emails_list سنعمل على حفظ عنواين البريد الالكتروني فيها، ثم نُعرف نمط البريد الالكتروني باسم email_rgx:
[pastacode lang=”python” manual=”emails_list%20%3D%20%5B%5D%0A%0Aemail_rgx%20%3D%20r%22%5Ba-z0-9%5C.%5C-%2B_%5D%2B%40%5Ba-z0-9%5C.%5C-%2B_%5D%2B%5C.com%22″ message=”” highlight=”” provider=”manual”/]
الجزء الرئيسي في المثال هو تعريف حلقة تكرار for loop تعمل على المرور على الصفحات الموجودة في قائمة pages ثم نٌرسل طلب request لكل صفحة ونُسند الرد في مُتغير باسم response. باستخدام الخاصية text الموجود في الرد يُمكننا استدعاء دالة findall الموجودة في مكتبة التعابير النمطية، وستعمل الدالة على البحث في الرد (والذي سيكون عبارة عن كود Html للصفحات) على كُل مجموعة كلمات تتوافق مع نمط البريد الإلكتروني، ثم نحفظ النتيجة في قائمة البريد الالكتروني emails_list ثم نطبعها:
[pastacode lang=”python” manual=”for%20page%20in%20pages%3A%0A%20%20%20%20response%20%3D%20requests.get(page)%0A%20%20%20%20emails%20%3D%20re.findall(email_rgx%2C%20response.text)%0A%20%20%20%20emails_list.extend(emails)%0A%0Aprint(emails_list)” message=”” highlight=”” provider=”manual”/]
والنتيجة هي مجموعة البريد الالكتروني الموجودة في الصفحات التي بحثنا فيها:
[pastacode lang=”bash” manual=”%5B%0A’%20fatima.brightimage%40gmail.com%20’%2C%20%0A’%20rattili%40ymail.com%20’%2C%0A’%20mqaisi%40jebrini-tech.com%20’%2C%0A’%20salamaalafifi%40gmail.com%20’%2C%20%0A’%20info%40change-arab.com%20’%2C%0A’%20z00882%40hotmail.com%20’%2C%0A’%20majedagel%40hotmail.com%20’%2C%0A’%20alara35%40hotmail.com%20’%2C%0A’%20albdayh%40yahoo.com%20’%2C%0A’%20sousy.pal%40hotmail.com%20’%2C%0A’%20eng.haniabuakar%40gmail.com%20’%2C%0A’%20adham671%40hotmail.com%20’%2C%0A’%20mohamed_am2008%40hotmail.com%20’%2C%0A’%20majic_hand5-83%40hotmail.com%20’%2C%0A’%20mourtaga%40hotmail.com%20’%2C%0A’%20shamala.co.b%40gmail.com%20’%2C%0A’%20aburagab1993%40hotmail.com%20’%2C%0A’%20yaqob92%40hotmail.com%20’%2C%0A’%20palcon_2005%40yahoo.com%20’%2C%0A’%20melmoamer%40yahoo.com%20’%2C%0A’%20farisco2009%40hotmail.com%20’%2C%0A’%20t-t52%40hotmail.com%20’%2C%0A’%20sword.1983%40hotmail.com%20’%2C%0A’%20nafez45%40hotmail.com%20’%2C%0A’%20c.eng.7asan%40hotmail.com%20’%2C%0A’%20al-zahabiay%40hotmail.com%20’%2C%0A’%20jazeera-co%40hotmail.com%20’%2C%0A’%20ng_tareq%40live.com%20’%2C%0A’%20marshod55%40gmail.com%20’%2C%0A’%20mym1969%40gmail.com%20’%2C%0A’%20mmozart_34%40hotmail.com%20’%2C%0A’%20eng.h.h.hasera%40hotmail.com%20’%2C%0A’%20attasonsco%40gmail.com%20’%2C%0A’%20info%40bashirsiksik.com%20’%2C%0A’%20coralco%40hotmail.com%20’%2C%0A’%20ijendeya%40hotmail.com%20’%2C%0A’%20aboihsan22%40gmail.com%20’%2C%20%0A’%20sohailco%40hotmail.com%20’%2C%0A’%20ramisultan_w%40yahoo.com%20’%2C%0A’%20majedhassan%40hotmail.com%20’%2C%0A’%20alrabitta%40hotmail.com%20’%2C%0A’%20info%40albayancom.com%20’%2C%20%0A’%20shaqorakalashco%40gmail.com%20’%2C%0A’%20alianco1996%40hotmail.com%20’%2C%0A’%20sayed_sa_2010%40hotmail.com%20’%2C%0A’%20samysliman%40hotmail.com%20’%2C%0A’%20bashitico%40gmail.com%20’%2C%0A’%20radwan77%40yahoo.com%20’%2C%0A’%20yrs1980%40gmail.com%20’%2C%0A’%20qwaider_co%40hotmail.com%20’%2C%0A’%20info%40mig-pal.com%20’%2C%0A’%20yyazji%40gmail.com%20’%2C%0A’%20abubassam80%40hotmail.com%20’%2C%0A’%20past34%40hotmail.com%20’%2C%0A’%20abdalla.1979%40hotmail.com%20’%2C%0A’%20khdair77%40hotmail.com%20’%2C%0A’%20read-aljana%40hotmail.com%20’%2C%0A’%20mo7.pal%40gmail.com%20’%2C%0A’%20abedsiam%40gmail.com%20’%2C%0A’%20doalqamar2010%40hotmail.com%20’%2C%0A’%20tdco%40outlook.com%20’%2C%0A’%20hamdehassnat17%40gmail.com%20’%2C%0A’%20jawadkuhail.co%40gmail.com%20’%2C%0A’%20qolaq%40hotmail.com%20’%2C%0A’%20zetonia-doors%40hotmail.com%20’%2C%0A’%20aldaya-co%40hotmail.com%20’%2C%0A’%20so19872011%40hotmail.com%20’%2C%0A’%20mohnd82%40hotmail.com%20’%2C%0A’%20ard_mwasem%40yahoo.com%20’%2C%0A’%20trm678%40hotmail.com%20’%2C%0A%5D” message=”” highlight=”” provider=”manual”/]
الشيفرة البرمجية الكاملة للمثال:
[pastacode lang=”python” manual=”import%20requests%0Aimport%20re%0A%0Apages%20%3D%20%5B%0A%20%20%20%20’http%3A%2F%2Fwww.pmdp.ps%2FListOfBusiness’%2C%0A%20%20%20%20’http%3A%2F%2Fwww.pmdp.ps%2Froster’%2C%0A%5D%0A%0Aemails_list%20%3D%20%5B%5D%0A%0Aemail_rgx%20%3D%20r%22%5Ba-z0-9%5C.%5C-%2B_%5D%2B%40%5Ba-z0-9%5C.%5C-%2B_%5D%2B%5C.com%22%0A%0Afor%20page%20in%20pages%3A%0A%20%20%20%20response%20%3D%20requests.get(page)%0A%20%20%20%20emails%20%3D%20re.findall(email_rgx%2C%20response.text)%0A%20%20%20%20emails_list.extend(emails)%0A%0Aprint(emails_list)” message=”” highlight=”” provider=”manual”/]
إلى هنا نكون قد انتهينا من شرح مكتبة requests بشكل مبسط وسهل، وقدمنا مثالًا عمليًا لاستخدامها. ونرجو أن نكون قد أفدناكم، وسنكون سُعداء بمشاركتكم معنا بالتعليق والإعجاب والمشاركة في حسابات بايثونات على وسائل الاتصال الاجتماعي.
ليس سيئاً , وفقت بالشرح
تحياتي :
القرصان الإلكتروني للتعليم
مفيد جدا وخلاق
جميل جدا جدا، جزاك الله خيرا.
ياريت تستمر بستفيد جدا من الشروحات فوق الوصف، شكرا.