تجريف الويب باستخدام مكتبة البايثون requests-html – بايثونات كمثال

تجريف الويب باستخدام مكتبة البايثون reqursdts-html - بايثونات كمثال

Web Scraping أو ما يُعرف في اللغة العربية بـ “تجريف الويب” من أهم المهارات في سوق الأتمتة وتعلم الآلة ( وخاصة بلغة البايثون ). حيث يستخدمه العديد من الباحثين والطلاب في جمع البيانات من المواقع الاخبارية ويوتيوب وغيرها من وسائل التواصل الإجتماعي. تلك المعلومات التي يتم جمعها تُستخدم في تطبيق أبحاث ومفاهيم علم البيانات وخوارزميات تعليم الآلة وفي إتمام رسائل الدراسات العليا.

أهلا بكم في بايثونات في هذا المقال الذي يتناول تجريف الويب Web Scraping باستخدام مكتبة جديدة ويتم شرحها لأول مرة.

web scraping tutorial

تُعد مكتبات البايثون مثل beautifulSoup و Scrapy من المكتبات المعروفة لتجريف الويب، ولكن اليوم لدينا مكتبة جديدة في ساحة التجريف مقارنة بسابقاتها، إنها مكتبة requests-html.

مطور هذه المكتبة هو نفسه الذي قام بتطوير مكتبة requests المبرمج الفذ كينيث رايتز. يمكن الوصول للموقع الرسمي للمكتبة من خلال زيارة العنوان التالي:

https://requests-html.kennethreitz.org/

مكتبة requests-html

تتميز مكتبة requests-html بسهولة استخدامها والتوثيق الممتاز والسهل لأوامرها. في هذا المقال سنتعرف على هذه المكتبة بشكل عام وبطريقة ميسرة للقارئ، وسنطور برنامج يعمل على تجريف بعض المعلومات من موقع بايثونات.

سنقوم بالبدء بشرح وكتابة مهام بسيطة ومن ثم سنضيف بعض الإضافات والتعديلات للبرنامج ليكون ذو فائدة أكبر. يمكن استخدام أي محرر نصوص بايثون لكتابة البرنامج.

اقرأ أيضًا: إستخراج البيانات من صفحات الإنترنت بلغة البايثون – لمحة سريعة

تثبيت المكتبة

requests-html

لنقم أولا بتثبيت المكتبة والتي بدورها تستدعي وجود مكتبة urllib3 لتعمل على أكمل وجه كما يلي:

# installing request-html package 
# it needs urllib3 as a requirement

!pip install urllib3 requests-html
# importing necessary libraries for the tutorial
from requests_html import HTMLSession # the base session class for our scraper
from pprint import pprint # pretty print function 

تم استيراد الفئة HTTPSession من مكتبة requests_html والذي من خلالها سننشيء كائن الاتصال بالموقع والولوج لمحتويات صفحاته واستخلاص المعلومات التي نريدها منه.

تجريف الويب بلغة البايثون – بايثونات كمثال عملي

كبداية، سنقوم بكتابة برنامج يقوم باستخلاص عناوين المقالات وروابط عناوينها. كذلك قمنا باستيراد pprint من مكتبة pprint والتي تقوم بتنسيق الطباعة على الشاشه للبيانات المستخلصة بشكل مرتب.

ننشيء كائن من نوع HTTPSession و نسميه s، ومن ثم نستدعي الدالة get لنقوم باستدعاء الصفحة الرئيسية لبايثونات:

# building an HTMLSession object
s = HTMLSession()

# getting the url
resp = s.get("https://www.pythonat.com")

و من ثم سنقوم باستخلاص الروابط جميعها في الصفحة وتخزينها في متغير كما في السطر : links = resp.html.absolute_links وأيضا نختبر عدد الروابط جميعها وكذلك بنية المعطيات المرجعة:

# getting the absolute links from the page
links = resp.html.absolute_links
print(f"length of links : {len(links)}")
print(f"type of links : {type(links)}")

print(links)

النتيجة:

length of links : 99
type of links : <class 'set'>
{'https://pythonat.com/articles/2017/03/', 'https://pythonat.com/articles/category/%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%b2%d8%ae%d8%b1%d9%81%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83%d9%8a%d9%81-%d9%86%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%af%d9%88%d8%a7%d9%84/', 'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%a8%d8%b1%d9%8a%d8%af-%d8%a5%d9%84%d9%83%d8%aa%d8%b1%d9%88%d9%86%d9%8a/', 'https://pythonat.com/articles/tag/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa/', 'https://pythonat.com/articles/2020/03/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b9%d9%84%d9%85-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%86-%d8%a7%d9%84%d8%b5%d9%81%d8%b1-%d8%ad%d8%aa%d9%89-%d8%a7%d9%84%d8%a7%d8%ad%d8%aa%d8%b1%d8%a7%d9%81/', 'https://pythonat.com/articles/tag/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa/', 'https://pythonat.com/articles/2017/12/', 'https://pythonat.com/articles/tag/%d9%85%d8%b4%d8%a7%d8%b1%d9%8a%d8%b9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/category/%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/2019/12/', 'https://pythonat.com/articles/category/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b4%d8%a8%d9%83%d8%a7%d8%aa/', 'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%a8%d8%b1%d9%8a%d8%af-%d8%a5%d9%84%d9%83%d8%aa%d8%b1%d9%88%d9%86%d9%8a/#comments', 'https://pythonat.com/articles/category/%d9%85%d8%b9%d8%a7%d8%ac%d9%84%d8%a9-%d8%a7%d9%84%d8%b5%d9%88%d8%b1-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/#comment-339', 'https://pythonat.com/articles/category/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d9%8a%d8%a8/', 'https://pythonat.com/articles/2020/09/', 'https://www.facebook.com/pythonat', 'https://pythonat.com/articles/tag/%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/category/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa/', 'https://pythonat.com/articles/category/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa/', 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-requests-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/#respond', 'https://pythonat.com/articles/2017/05/', 'https://ar.wordpress.org/', 'https://pythonat.com/articles/category/%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/tag/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a8%d8%a7%d9%84%d8%b9%d8%b1%d8%a8%d9%8a/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://www.linkedin.com/company/pythonat', 'https://pythonat.com/wp-login.php', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2-%d9%85%d9%86-%d8%ae%d9%84/', 'https://pythonat.com/articles/2020/05/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2-%d9%85%d9%86-%d8%ae%d9%84/#respond', 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-matplotlib-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%84%d8%ab%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7/#comment-350', 'https://pythonat.com/articles/2020/04/', 'https://pythonat.com/articles/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a3%d9%87%d9%85-%d8%a7%d9%84%d9%85%d9%83%d8%aa%d8%a8%d8%a7/#respond', 'https://pythonat.com/articles/tag/netflix/', 'https://pythonat.com/articles/2018/04/', 'https://pythonat.com/articles/2020/01/', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d9%8a%d8%a9-%d9%83%d9%8a%d9%81-%d8%aa%d9%83%d8%aa%d8%a8-%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d8%a8%d8%b1%d9%85/', 'https://pythonat.com/articles/category/%d8%a3%d8%af%d9%88%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/netflix-%d9%88%d8%b7%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%aa%d8%b1%d9%81%d9%8a%d9%87-%d8%a7%d9%84%d8%b0%d9%8a-%d9%8a%d9%85%d8%b1-%d8%b9%d8%a8%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/2017/09/', 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83/#respond', 'https://pythonat.com/articles/tag/%d9%85%d8%a7-%d9%87%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/2017/11/', 'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%', 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83/', 'http://linuxac.org', 'https://pythonat.com/articles/tag/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa/', 'https://pythonat.com/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b9%d9%84%d9%85-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'http://designorbital.com/portfolio-wordpress-themes/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b9%d9%84%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/tag/%d9%86%d8%b5%d8%a7%d8%a6%d8%ad-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%b2%d8%ae%d8%b1%d9%81%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83%d9%8a%d9%81-%d9%86%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%af%d9%88%d8%a7%d9%84/#respond', 'https://pythonat.com/articles/netflix-%d9%88%d8%b7%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%aa%d8%b1%d9%81%d9%8a%d9%87-%d8%a7%d9%84%d8%b0%d9%8a-%d9%8a%d9%85%d8%b1-%d8%b9%d8%a8%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/#respond', 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-sqlite-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/#respond', 'https://pythonat.com/articles/2018/01/', 'https://pythonat.com/articles/%d8%a3%d8%b1%d8%b3%d9%84-%d8%b4%d9%83%d8%b1%d8%a7-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa-%d8%b9%d8%a8%d8%b1-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-%d8%b3%d9%8a%d9%84%d9%8a%d9%86%d9%8a%d9%88%d9%85/#comment-427', 'https://pythonat.com/articles/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-sqlite-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/#comments', 'https://pythonat.com/articles/2017/10/', 'https://twitter.com/pythonat1', 'https://pythonat.com/articles/tag/%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-requests-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/page/2/', 'https://pythonat.com/articles/tag/%d9%85%d8%b4%d8%a7%d8%b1%d9%8a%d8%b9-%d8%a8%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/tag/sqlite/', 'https://pythonat.com/articles/category/%d8%aa%d8%b9%d9%84%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a3%d9%87%d9%85-%d8%a7%d9%84%d9%85%d9%83%d8%aa%d8%a8%d8%a7/', 'https://pythonat.com/articles/2018/05/', 'https://pythonat.com/articles/tag/%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2/', 'https://pythonat.com/articles/2017/04/', 'https://pythonat.com/articles/2017/07/', 'https://pythonat.com/articles/category/%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d9%85%d8%b9%d8%a7%d9%84%d8%ac%d8%a9-%d8%a7%d9%84%d9%86%d8%b5%d9%88%d8%b5/', 'https://pythonat.com/articles/tag/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/%d8%aa%d9%88%d8%a7%d8%b5%d9%84-%d9%85%d8%b9%d9%8a/', 'https://pythonat.com/articles/%d8%aa%d8%ad%d9%84%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d8%ac%d9%84%d8%a7%d8%aa/#comment-399', 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-numpy-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%a3%d9%88%d9%84%d9%89-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8/#comment-340', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%af%d9%88%d8%a7%d9%84-%d9%88%d8%a7%d9%84%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88/', 'https://pythonat.com/articles/2020/07/', 'https://www.pythonat.com/', 'https://pythonat.com/articles/tag/%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/tag/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/2020/08/', 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d9%8a%d8%a9-%d9%83%d9%8a%d9%81-%d8%aa%d9%83%d8%aa%d8%a8-%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d8%a8%d8%b1%d9%85/#respond', 'https://pythonat.com/%d9%86%d8%a8%d8%b0%d8%a9-%d8%b9%d9%86/', 'https://pythonat.com/articles/tag/%d8%a7%d9%83%d9%88%d8%a7%d8%af-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/articles/tag/%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84/', 'https://pythonat.com/articles/category/%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%aa%d8%b9%d9%84%d9%8a%d9%85-%d8%a7%d9%84%d8%a7%d9%84%d8%a9/', 'https://pythonat.com/feed/', 'https://pythonat.com/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d8%ac-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/', 'https://pythonat.com/comments/feed/', 'https://pythonat.com/articles/2020/02/'}

هنا نستخلص عناوين المقالات من الصفحة ونتحرى بشكل بسيط عن المكون الذي نريدة باستخدام أمر inspect في المتصفح، ثم باستخدام دالة html.find نقوم بتعيين المُحدد الهدف والذي يحتوي بداخله على المعلومات التي تريدها.

ملاحظة : لاختيار css class نقوم بكتابة . ولاختيار if نقوم بكتابة #.

هنا اخترنا الفئة .entry-title:

# targetting the .entry-title class
article_titles = resp.html.find(".entry-title")

# an empty dictionary for story the articles' titles
pythonat_dict ={}

# filling the dictionary above with keys of the .text attibutes amd their values with their absolute links
for a_t in article_titles:
  pythonat_dict[a_t.text]=a_t.absolute_links

{}=pythonat_dict وبالسطر السابق قمنا بإنشاء قاموس فارغ لنخزن به عناوين المقالات كفماتيح والروابط كقيم.

نقوم بالمرور بمحتويات القيم المرجعة والوصول بخاصية النص .text والتي هي عنوان المقال وتعيينها كمفتاح جديد في اللقاموس السابق، ونستدعي دالة abosolute_links للوصول للروابط الفعالة تحت هذه الفئة.

من المعاينة في المتصفح نجدها رابط واحد فنعمل على تخزينها كقيمة للمفتاح:

for a_t in article_titles:
pythonat_dict[a_t.text]=a_t.absolute_links

لنطبع القاموس الذي قمنا بتعبئته ونعاين ماهي محتوياته وانواعها، وبعد الطباعة، نلاحظ أن كل قيمة عبارة عن مجموعه set من عنصر واحد وهو الرابط المطلق لصفحة المقال الكامل:

# print the collected and filled dictionary with pprint
pprint(pythonat_dict)

النتيجة:

{'أمن المعلومات في البايثون – أهم المكتبات البايثونية لأمن المعلومات': {'https://pythonat.com/articles/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a3%d9%87%d9%85-%d8%a7%d9%84%d9%85%d9%83%d8%aa%d8%a8%d8%a7/'},
 'البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d9%8a%d8%a9-%d9%83%d9%8a%d9%81-%d8%aa%d9%83%d8%aa%d8%a8-%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d8%a8%d8%b1%d9%85/'},
 'البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'التعامل مع الريجستري في الويندوز من خلال لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2-%d9%85%d9%86-%d8%ae%d9%84/'},
 'المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر': {'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%b2%d8%ae%d8%b1%d9%81%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83%d9%8a%d9%81-%d9%86%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%af%d9%88%d8%a7%d9%84/'},
 'تطبيقات بايثون – كيف تُرسل بريد إلكتروني مع مرفق في البايثون': {'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%a8%d8%b1%d9%8a%d8%af-%d8%a5%d9%84%d9%83%d8%aa%d8%b1%d9%88%d9%86%d9%8a/'},
 'شركات وبايثون – Netflix وطريق الترفيه الذي يمر عبر البايثون': {'https://pythonat.com/articles/netflix-%d9%88%d8%b7%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%aa%d8%b1%d9%81%d9%8a%d9%87-%d8%a7%d9%84%d8%b0%d9%8a-%d9%8a%d9%85%d8%b1-%d8%b9%d8%a8%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'قواعد البيانات SQLite والبايثون – كيف تُنشئ قاعدة بيانات وتتعامل معها': {'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-sqlite-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'قواعد البيانات الأوراكل والبايثون –كيف نتعامل مع الاوراكل من كود بايثون': {'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83/'},
 'مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-requests-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'}}

ممتاز جدا. والآن بعد أن نجحنا بجرف المعلومات التي نريدها وتخزينها في قاموس خاص بها، لنكرر التجربة ولكن لنقم بإضافة ميزة مسح عدد من صفحات مدونة بايثونات واستخلاص نفس المعلومات التي استخلصناها سابقا.

تجريف البيانات من صفحات داخلية

Web scraping

قبل ذلك يجب أن نعرف كيف هو شكل عناوين روابط الصفحات في بايثونات من الصفحة الأولى الى الخامسة.

سنجد أن شكل الروابط سيكون كالتالي:

https://pythonat.com/page/<رقم الصفحة في المدونة>/

من هنا سنعرف كيف سنبني رابط أساسي كقالب نغير فيه رقم الصفحة في كل مرة عن طريق حلقة تكرارية تمر على عدد الصفحات ليتم مسح واستخلاص عناوين المقالات وروابط صفحات المقالات في الصفحات الخمس الأولى وتخزينها في قاموس جديد:
# practice 2
#initiaing and creating a new htmal session object , s2
# ands getting the targetted link

s2 = HTMLSession()
resaponse = s2.get("http://www.pythonat.com")
## after checking the base url of our targetted website and how it paginates its
## pages in the format of --> https://pythonat.com/page/<page_number>/
# we will scrape 5 pages for now

# base url
base_url = "https://pythonat.com/page/"
# created a new dictionary fofr our new scrape
article_dict2={}
# a loop to access first 5 pages to be scraped
for i in range(1,6):
  # exception handling for any error in the scraping phase
  try:
    response = s2.get(base_url+str(i)+"/")
    print(base_url+str(i)+"/")
    
    # targetted the same css class to collect the article titles
    article_titles2 = response.html.find(".entry-title")

    # filling the new dictionary with keys of artile titles and values of links
    for at2 in article_titles2:
      article_dict2[at2.text]=at2.links
  except Exception as e:
    print(f"XXXX >>> {str(e)}")

النتيجة:

https://pythonat.com/page/1/
https://pythonat.com/page/2/
https://pythonat.com/page/3/
https://pythonat.com/page/4/
https://pythonat.com/page/5/

جميل جدا. قمنا بمسح الصفحات الخمس الأولى بنجاح، وللإحتياط قمنا بكتابة استثناء ليستمر البرنامج بالعمل حتى وإن حدث خطأ ما أثناء عملية الدخول للصفحات المراد مسحها أو عملية المسح نفسها، كل ذلك في نطاق : try,except.

لنتأكد من أن العملية سارت كما يجب. لنقم بطباعة طول ومحتويات القاموس الثاني كما يلي:

print(len(article_dict2))
article_dict2

والنتيجة:

42
{'Jupyter Notebook – الأداة التي لا يستغني عنها أي عالم ومُحلل بيانات بالبايثون': {'https://pythonat.com/articles/jupyter-notebook-%d8%a7%d9%84%d8%a3%d8%af%d8%a7%d8%a9-%d8%a7%d9%84%d8%aa%d9%8a-%d9%84%d8%a7-%d9%8a%d8%b3%d8%aa%d8%ba%d9%86%d9%8a-%d8%b9%d9%86%d9%87%d8%a7-%d8%a3%d9%8a-%d8%b9%d8%a7%d9%84%d9%85-%d9%88/'},
 'أداة virtualenv كأداة لتسهيل البرمجة والعمل بلغة البايثون': {'https://pythonat.com/articles/%d8%a3%d8%af%d8%a7%d8%a9-virtualenv-%d9%83%d8%a3%d8%af%d8%a7%d8%a9-%d9%84%d8%aa%d8%b3%d9%87%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88/'},
 'أرسل “شكرًا” لموقع بايثونات عبر مكتبة سيلينيوم': {'https://pythonat.com/articles/%d8%a3%d8%b1%d8%b3%d9%84-%d8%b4%d9%83%d8%b1%d8%a7-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa-%d8%b9%d8%a8%d8%b1-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-%d8%b3%d9%8a%d9%84%d9%8a%d9%86%d9%8a%d9%88%d9%85/'},
 'أكتب برامج CLI بسعادة مع مكتبة Click في لغة البايثون – تطبيق عملي': {'https://pythonat.com/articles/%d8%a3%d9%83%d8%aa%d8%a8-%d8%a8%d8%b1%d8%a7%d9%85%d8%ac-cli-%d8%a8%d8%b3%d8%b9%d8%a7%d8%af%d8%a9-%d9%85%d8%b9-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-click-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8/'},
 'أمن المعلومات في البايثون – أهم المكتبات البايثونية لأمن المعلومات': {'https://pythonat.com/articles/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a3%d9%87%d9%85-%d8%a7%d9%84%d9%85%d9%83%d8%aa%d8%a8%d8%a7/'},
 'إستخراج البيانات من صفحات الإنترنت بلغة البايثون – لمحة سريعة': {'https://pythonat.com/articles/%d8%a5%d8%b3%d8%aa%d8%ae%d8%b1%d8%a7%d8%ac-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d9%85%d9%86-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d8%a5%d9%86%d8%aa%d8%b1%d9%86%d8%aa-%d8%a8/'},
 'ادارة مكتبات بايثون وطريقة تثبيتها': {'https://pythonat.com/articles/%d8%a7%d8%af%d8%a7%d8%b1%d8%a9-%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%b7%d8%b1%d9%8a%d9%82%d8%a9-%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa%d9%87%d8%a7/'},
 'البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d9%8a%d8%a9-%d9%83%d9%8a%d9%81-%d8%aa%d9%83%d8%aa%d8%a8-%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d8%a8%d8%b1%d9%85/'},
 'البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'التسجيل Logging في البايثون – الدليل البسيط': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b3%d8%ac%d9%8a%d9%84-logging-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d9%84%d8%af%d9%84%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d8%b3/'},
 'التعامل مع الريجستري في الويندوز من خلال لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2-%d9%85%d9%86-%d8%ae%d9%84/'},
 'الدوال والوحدات في بايثون – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d8%af%d9%88%d8%a7%d9%84-%d9%88%d8%a7%d9%84%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88/'},
 'المتغيرات في بايثون وكيفية التعامل مع التراكيب – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%aa%d8%ba%d9%8a%d8%b1%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%aa%d8%b1%d8%a7%d9%83%d9%8a%d8%a8-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8/'},
 'المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر': {'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%b2%d8%ae%d8%b1%d9%81%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83%d9%8a%d9%81-%d9%86%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%af%d9%88%d8%a7%d9%84/'},
 'المفكرة التفاعلية في بايثون – Jupyter NoteBook': {'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d9%81%d9%83%d8%b1%d8%a9-%d8%a7%d9%84%d8%aa%d9%81%d8%a7%d8%b9%d9%84%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-jupyter-notebook/'},
 'النصوص في بايثون – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d8%a7%d9%84%d9%86%d8%b5%d9%88%d8%b5-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa-%d9%84%d8%aa%d8%b9%d9%84%d9%85/'},
 'اوامر لغة بايثون لنظام التشغيل من خلال مكتبة subprocess': {'https://pythonat.com/articles/%d8%a7%d9%88%d8%a7%d9%85%d8%b1-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%84%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%aa%d8%b4%d8%ba%d9%8a%d9%84-%d9%85%d9%86-%d8%ae%d9%84%d8%a7%d9%84/'},
 'بايثون اناكوندا – أسهل الطُرق لتثبيت المكتبات العلمية في البايثون': {'https://pythonat.com/articles/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d9%86%d8%a7%d9%83%d9%88%d9%86%d8%af%d8%a7-%d8%a3%d8%b3%d9%87%d9%84-%d8%a7%d9%84%d8%b7%d9%8f%d8%b1%d9%82/'},
 'بايثون والمرونة في البرمجة – الدليل الشامل لفهم comprehensions في البايثون': {'https://pythonat.com/articles/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d9%85%d8%b1%d9%88%d9%86%d8%a9-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9/'},
 'برمجة الشبكات بالبايثون – كيف تُرسل أوامر لعدة أجهزة عبر الشبكة': {'https://pythonat.com/articles/%d8%a8%d8%b1%d9%85%d8%ac-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-fabric/'},
 'تحليل البيانات باستخدام بايثون – سجلات الوفيات والاصابات بفيروس كورونا كمثال': {'https://pythonat.com/articles/%d8%aa%d8%ad%d9%84%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d8%ac%d9%84%d8%a7%d8%aa/'},
 'تطبيقات البايثون في التعامل مع محرر النصوص مايكروسوفت وورد': {'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%81%d9%8a-%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d9%85%d8%ad%d8%b1%d8%b1-%d8%a7%d9%84/'},
 'تطبيقات بايثون – كيف تُرسل بريد إلكتروني مع مرفق في البايثون': {'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%a8%d8%b1%d9%8a%d8%af-%d8%a5%d9%84%d9%83%d8%aa%d8%b1%d9%88%d9%86%d9%8a/'},
 'تطبيقات لغة البايثون – تعلم كيف تبني إضافات plugins لبرنامج بايثون': {'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%aa%d8%b9%d9%84%d9%85-%d9%83%d9%8a%d9%81-%d8%aa%d8%a8%d9%86%d9%8a-%d8%a5%d8%b6%d8%a7/'},
 'جُمل التحكم في بايثون – سلسلة بايثونات لتعلم لغة البايثون للمبتدئين': {'https://pythonat.com/articles/%d8%ac%d9%8f%d9%85%d9%84-%d8%a7%d9%84%d8%aa%d8%ad%d9%83%d9%85-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa/'},
 'شركات وبايثون – Netflix وطريق الترفيه الذي يمر عبر البايثون': {'https://pythonat.com/articles/netflix-%d9%88%d8%b7%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%aa%d8%b1%d9%81%d9%8a%d9%87-%d8%a7%d9%84%d8%b0%d9%8a-%d9%8a%d9%85%d8%b1-%d8%b9%d8%a8%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'قواعد البيانات SQLite والبايثون – كيف تُنشئ قاعدة بيانات وتتعامل معها': {'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-sqlite-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'قواعد البيانات الأوراكل والبايثون –كيف نتعامل مع الاوراكل من كود بايثون': {'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83/'},
 'كيف تبني RESTful API باستخدام إطار البايثون Django': {'https://pythonat.com/articles/%d9%83%d9%8a%d9%81-%d8%aa%d8%a8%d9%86%d9%8a-restful-api-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-%d8%a5%d8%b7%d8%a7%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-django/'},
 'كيف تتعامل مع بيانات JSON في لغة بايثون': {'https://pythonat.com/articles/%d9%83%d9%8a%d9%81-%d8%aa%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-json-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'لغة البرمجة بايثون والتعامل مع نظام التشغيل من خلال مكتبة os': {'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84/'},
 'لغة بايثون للمبتدئين – سلسلة بايثونات لتعلم البايثون': {'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa/'},
 'لغة بايثون والتعامل مع الملفات من حيث الكتابة والقراءة والتعديل': {'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa-%d9%85%d9%86-%d8%ad%d9%8a%d8%ab-%d8%a7/'},
 'معالجة الأخطاء في بايثون – سلسلة بايثونات لتعلم لغة البايثون': {'https://pythonat.com/articles/%d9%85%d8%b9%d8%a7%d9%84%d8%ac%d8%a9-%d8%a7%d9%84%d8%a3%d8%ae%d8%b7%d8%a7%d8%a1-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'مكتبات علم البيانات بالبايثون | 5 مكتبات مشهورة': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-5-%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa/'},
 'مكتبة Matplotlib – الخطوة الثالثة في علم البيانات بالبايثون': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-matplotlib-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%84%d8%ab%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7/'},
 'مكتبة Numpy – الخطوة الأولى في علم البيانات بلغة البايثون': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-numpy-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%a3%d9%88%d9%84%d9%89-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8/'},
 'مكتبة OpenCV بالبايثون وكيفية اختبار وجود عناصر معينة': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-opencv-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d9%83%d9%8a%d9%81%d9%8a%d8%a9-%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9%d9%87%d8%a7/'},
 'مكتبة Pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الأول': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-pandas-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86/'},
 'مكتبة pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الثاني': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-pandas-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86-2/'},
 'مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-requests-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'},
 'مكتبة scikit-learn – لمحة سريعة عن مكتبة البايثون لتعليم الآلة': {'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-scikit-learn-%d9%84%d9%85%d8%ad%d8%a9-%d8%b3%d8%b1%d9%8a%d8%b9%d8%a9-%d8%b9%d9%86-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'}}

عظيم. ولكن لدينا مشكلة وهي أن القيمة لكل مفتاح هي عبارة عن مجموعة تحتوي نص الرابط لصفحة كل مقال وليست نص الرابط المباشر مما سيجعل التعامل معها غير عملي بالنسبة لنا هنا.

لحل تلك المشكلة سنقوم بتعريف قاموس جديد فارغ نملي مفاتيحه من مفاتيح القاموس السابق ونقوم باستخدام الدالة pop الخاصة بالمجموعات والتي ستقوم بأخذ مافي المجموعه من عناصر. في حالتنا عنصر واحد أي رابط واحد لكل مجموعة ونخزنها كقيمة لكل مفتاح من مفاتيح القاموس الجديد.

# converting the value from a set to be equal to the string of the link inside
# the set

# creating a new dictionary to store the cleaned k,v data
final_dict = {}

for k,v in article_dict2.items():
  final_dict[k] = v.pop()

final_dict

والنتيجة:

{'Jupyter Notebook – الأداة التي لا يستغني عنها أي عالم ومُحلل بيانات بالبايثون': 'https://pythonat.com/articles/jupyter-notebook-%d8%a7%d9%84%d8%a3%d8%af%d8%a7%d8%a9-%d8%a7%d9%84%d8%aa%d9%8a-%d9%84%d8%a7-%d9%8a%d8%b3%d8%aa%d8%ba%d9%86%d9%8a-%d8%b9%d9%86%d9%87%d8%a7-%d8%a3%d9%8a-%d8%b9%d8%a7%d9%84%d9%85-%d9%88/',
 'أداة virtualenv كأداة لتسهيل البرمجة والعمل بلغة البايثون': 'https://pythonat.com/articles/%d8%a3%d8%af%d8%a7%d8%a9-virtualenv-%d9%83%d8%a3%d8%af%d8%a7%d8%a9-%d9%84%d8%aa%d8%b3%d9%87%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88/',
 'أرسل “شكرًا” لموقع بايثونات عبر مكتبة سيلينيوم': 'https://pythonat.com/articles/%d8%a3%d8%b1%d8%b3%d9%84-%d8%b4%d9%83%d8%b1%d8%a7-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa-%d8%b9%d8%a8%d8%b1-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-%d8%b3%d9%8a%d9%84%d9%8a%d9%86%d9%8a%d9%88%d9%85/',
 'أكتب برامج CLI بسعادة مع مكتبة Click في لغة البايثون – تطبيق عملي': 'https://pythonat.com/articles/%d8%a3%d9%83%d8%aa%d8%a8-%d8%a8%d8%b1%d8%a7%d9%85%d8%ac-cli-%d8%a8%d8%b3%d8%b9%d8%a7%d8%af%d8%a9-%d9%85%d8%b9-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-click-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8/',
 'أمن المعلومات في البايثون – أهم المكتبات البايثونية لأمن المعلومات': 'https://pythonat.com/articles/%d8%a3%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b9%d9%84%d9%88%d9%85%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a3%d9%87%d9%85-%d8%a7%d9%84%d9%85%d9%83%d8%aa%d8%a8%d8%a7/',
 'إستخراج البيانات من صفحات الإنترنت بلغة البايثون – لمحة سريعة': 'https://pythonat.com/articles/%d8%a5%d8%b3%d8%aa%d8%ae%d8%b1%d8%a7%d8%ac-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d9%85%d9%86-%d8%b5%d9%81%d8%ad%d8%a7%d8%aa-%d8%a7%d9%84%d8%a5%d9%86%d8%aa%d8%b1%d9%86%d8%aa-%d8%a8/',
 'ادارة مكتبات بايثون وطريقة تثبيتها': 'https://pythonat.com/articles/%d8%a7%d8%af%d8%a7%d8%b1%d8%a9-%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%b7%d8%b1%d9%8a%d9%82%d8%a9-%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa%d9%87%d8%a7/',
 'البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة': 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d9%8a%d8%a9-%d9%83%d9%8a%d9%81-%d8%aa%d9%83%d8%aa%d8%a8-%d8%b4%d9%8a%d9%81%d8%b1%d8%a9-%d8%a8%d8%b1%d9%85/',
 'البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://pythonat.com/articles/%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d9%83%d8%a7%d8%a6%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'التسجيل Logging في البايثون – الدليل البسيط': 'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b3%d8%ac%d9%8a%d9%84-logging-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d9%84%d8%af%d9%84%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d8%b3/',
 'التعامل مع الريجستري في الويندوز من خلال لغة البايثون': 'https://pythonat.com/articles/%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%b1%d9%8a%d8%ac%d8%b3%d8%aa%d8%b1%d9%8a-%d9%81%d9%8a-%d8%a7%d9%84%d9%88%d9%8a%d9%86%d8%af%d9%88%d8%b2-%d9%85%d9%86-%d8%ae%d9%84/',
 'الدوال والوحدات في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://pythonat.com/articles/%d8%a7%d9%84%d8%af%d9%88%d8%a7%d9%84-%d9%88%d8%a7%d9%84%d9%88%d8%ad%d8%af%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88/',
 'المتغيرات في بايثون وكيفية التعامل مع التراكيب – سلسلة بايثونات لتعلم لغة البايثون': 'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%aa%d8%ba%d9%8a%d8%b1%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%aa%d8%b1%d8%a7%d9%83%d9%8a%d8%a8-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8/',
 'المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر': 'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d8%b2%d8%ae%d8%b1%d9%81%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83%d9%8a%d9%81-%d9%86%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%af%d9%88%d8%a7%d9%84/',
 'المفكرة التفاعلية في بايثون – Jupyter NoteBook': 'https://pythonat.com/articles/%d8%a7%d9%84%d9%85%d9%81%d9%83%d8%b1%d8%a9-%d8%a7%d9%84%d8%aa%d9%81%d8%a7%d8%b9%d9%84%d9%8a%d8%a9-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-jupyter-notebook/',
 'النصوص في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://pythonat.com/articles/%d8%a7%d9%84%d9%86%d8%b5%d9%88%d8%b5-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa-%d9%84%d8%aa%d8%b9%d9%84%d9%85/',
 'اوامر لغة بايثون لنظام التشغيل من خلال مكتبة subprocess': 'https://pythonat.com/articles/%d8%a7%d9%88%d8%a7%d9%85%d8%b1-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%84%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%aa%d8%b4%d8%ba%d9%8a%d9%84-%d9%85%d9%86-%d8%ae%d9%84%d8%a7%d9%84/',
 'بايثون اناكوندا – أسهل الطُرق لتثبيت المكتبات العلمية في البايثون': 'https://pythonat.com/articles/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d9%86%d8%a7%d9%83%d9%88%d9%86%d8%af%d8%a7-%d8%a3%d8%b3%d9%87%d9%84-%d8%a7%d9%84%d8%b7%d9%8f%d8%b1%d9%82/',
 'بايثون والمرونة في البرمجة – الدليل الشامل لفهم comprehensions في البايثون': 'https://pythonat.com/articles/%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d9%85%d8%b1%d9%88%d9%86%d8%a9-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9/',
 'برمجة الشبكات بالبايثون – كيف تُرسل أوامر لعدة أجهزة عبر الشبكة': 'https://pythonat.com/articles/%d8%a8%d8%b1%d9%85%d8%ac-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-fabric/',
 'تحليل البيانات باستخدام بايثون – سجلات الوفيات والاصابات بفيروس كورونا كمثال': 'https://pythonat.com/articles/%d8%aa%d8%ad%d9%84%d9%8a%d9%84-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d8%ac%d9%84%d8%a7%d8%aa/',
 'تطبيقات البايثون في التعامل مع محرر النصوص مايكروسوفت وورد': 'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%81%d9%8a-%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d9%85%d8%ad%d8%b1%d8%b1-%d8%a7%d9%84/',
 'تطبيقات بايثون – كيف تُرسل بريد إلكتروني مع مرفق في البايثون': 'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%a7%d8%b1%d8%b3%d8%a7%d9%84-%d8%a8%d8%b1%d9%8a%d8%af-%d8%a5%d9%84%d9%83%d8%aa%d8%b1%d9%88%d9%86%d9%8a/',
 'تطبيقات لغة البايثون – تعلم كيف تبني إضافات plugins لبرنامج بايثون': 'https://pythonat.com/articles/%d8%aa%d8%b7%d8%a8%d9%8a%d9%82%d8%a7%d8%aa-%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%aa%d8%b9%d9%84%d9%85-%d9%83%d9%8a%d9%81-%d8%aa%d8%a8%d9%86%d9%8a-%d8%a5%d8%b6%d8%a7/',
 'جُمل التحكم في بايثون – سلسلة بايثونات لتعلم لغة البايثون للمبتدئين': 'https://pythonat.com/articles/%d8%ac%d9%8f%d9%85%d9%84-%d8%a7%d9%84%d8%aa%d8%ad%d9%83%d9%85-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa/',
 'شركات وبايثون – Netflix وطريق الترفيه الذي يمر عبر البايثون': 'https://pythonat.com/articles/netflix-%d9%88%d8%b7%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%aa%d8%b1%d9%81%d9%8a%d9%87-%d8%a7%d9%84%d8%b0%d9%8a-%d9%8a%d9%85%d8%b1-%d8%b9%d8%a8%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'قواعد البيانات SQLite والبايثون – كيف تُنشئ قاعدة بيانات وتتعامل معها': 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-sqlite-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'قواعد البيانات الأوراكل والبايثون –كيف نتعامل مع الاوراكل من كود بايثون': 'https://pythonat.com/articles/%d9%82%d9%88%d8%a7%d8%b9%d8%af-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a7%d9%84%d8%a3%d9%88%d8%b1%d8%a7%d9%83%d9%84-%d9%88%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%83/',
 'كيف تبني RESTful API باستخدام إطار البايثون Django': 'https://pythonat.com/articles/%d9%83%d9%8a%d9%81-%d8%aa%d8%a8%d9%86%d9%8a-restful-api-%d8%a8%d8%a7%d8%b3%d8%aa%d8%ae%d8%af%d8%a7%d9%85-%d8%a5%d8%b7%d8%a7%d8%b1-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-django/',
 'كيف تتعامل مع بيانات JSON في لغة بايثون': 'https://pythonat.com/articles/%d9%83%d9%8a%d9%81-%d8%aa%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-json-%d9%81%d9%8a-%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'لغة البرمجة بايثون والتعامل مع نظام التشغيل من خلال مكتبة os': 'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84/',
 'لغة بايثون للمبتدئين – سلسلة بايثونات لتعلم البايثون': 'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86%d8%a7%d8%aa/',
 'لغة بايثون والتعامل مع الملفات من حيث الكتابة والقراءة والتعديل': 'https://pythonat.com/articles/%d9%84%d8%ba%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa-%d9%85%d9%86-%d8%ad%d9%8a%d8%ab-%d8%a7/',
 'معالجة الأخطاء في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://pythonat.com/articles/%d9%85%d8%b9%d8%a7%d9%84%d8%ac%d8%a9-%d8%a7%d9%84%d8%a3%d8%ae%d8%b7%d8%a7%d8%a1-%d9%81%d9%8a-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d8%b3%d9%84%d8%b3%d9%84%d8%a9-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'مكتبات علم البيانات بالبايثون | 5 مكتبات مشهورة': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-5-%d9%85%d9%83%d8%aa%d8%a8%d8%a7%d8%aa/',
 'مكتبة Matplotlib – الخطوة الثالثة في علم البيانات بالبايثون': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-matplotlib-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%84%d8%ab%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7/',
 'مكتبة Numpy – الخطوة الأولى في علم البيانات بلغة البايثون': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-numpy-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%a3%d9%88%d9%84%d9%89-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86%d8%a7%d8%aa-%d8%a8/',
 'مكتبة OpenCV بالبايثون وكيفية اختبار وجود عناصر معينة': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-opencv-%d8%a8%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-%d9%88%d9%83%d9%8a%d9%81%d9%8a%d8%a9-%d8%a7%d9%84%d8%aa%d8%b9%d8%a7%d9%85%d9%84-%d9%85%d8%b9%d9%87%d8%a7/',
 'مكتبة Pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الأول': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-pandas-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86/',
 'مكتبة pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الثاني': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-pandas-%d8%a7%d9%84%d8%ae%d8%b7%d9%88%d8%a9-%d8%a7%d9%84%d8%ab%d8%a7%d9%86%d9%8a%d8%a9-%d9%81%d9%8a-%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%a8%d9%8a%d8%a7%d9%86-2/',
 'مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-requests-%d9%81%d9%8a-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/',
 'مكتبة scikit-learn – لمحة سريعة عن مكتبة البايثون لتعليم الآلة': 'https://pythonat.com/articles/%d9%85%d9%83%d8%aa%d8%a8%d8%a9-scikit-learn-%d9%84%d9%85%d8%ad%d8%a9-%d8%b3%d8%b1%d9%8a%d8%b9%d8%a9-%d8%b9%d9%86-%d9%85%d9%83%d8%aa%d8%a8%d8%a9-%d8%a7%d9%84%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86/'}

الحمد لله ، أتممنا الغرض من البرنامج بشكل كامل و بنجاح.

اقرأ أيضًا: أرسل “شكرًا” لموقع بايثونات عبر مكتبة سيلينيوم

تقصير الروابط باستخدام مكتبة البايثون pyshorteners 

الآن لنقم بعمل شيء يضيف فائدة أكبر للبرنامج وهي بأن نقوم بتحويل جميع تلك القيم للمفاتيح والتي هي عبارة عن روابط طويلة إلى روابط قصيرة يسهل قراءتها. أيضا، لنقم بتخزين تلك المعلومات في ملف csv لكي نتمكن من استعمالها في أي برنامج نكتبة مستفبلا.

أولا لنقم بتثبيت مكتبة pyshorteners والتي تعتمد على مكتبة folium عن طريق مثبت الحزم pip كما فعلنا سابقا:

# installing the pyshorteners library to create tyinyurl version of our
# links that are stored as values in our dictionary
# it requires folium library
!pip install folium pyshorteners

و الآن لنقم باستيراد مكتبة pyshirteners، ومن ثم نقوم بإنشاء كائن من نوع pyshorteners.Shortener لنتسخدمه لاحقا لتصغير روابط صفحات المقالات، ومن ثم من خلال المورو علي جميع مفاتيح وقيم القاموس السابق، نستدعي دالة تحويل الروابط إلى روابط أصغر للكائن shortener وهي tinyurl.short. سنغذيها بمعامل وهو قيم المفاتيح الطويلة لتقوم بتصغيرها وثم تخزينها بمتغير short_url ليكون هو القيمة الجديدة لكل مفتاح موجود بالقاموس.

# importing the url shirtening library
import pyshorteners

# creating a shortening object
shortener = pyshorteners.Shortener()


# iterating through the dictionary to access values and shorten them
for k,v in final_dict.items():
  #shortening the urls stored as values
  short_url = shortener.tinyurl.short(v)
  #assigning each key to the new value ==> shortened url
  final_dict[k] = short_url

final_dict

والنتيجة:

{'Jupyter Notebook – الأداة التي لا يستغني عنها أي عالم ومُحلل بيانات بالبايثون': 'https://tinyurl.com/y3o2dbap',
 'أداة virtualenv كأداة لتسهيل البرمجة والعمل بلغة البايثون': 'https://tinyurl.com/y2ws392c',
 'أرسل “شكرًا” لموقع بايثونات عبر مكتبة سيلينيوم': 'https://tinyurl.com/y48sglet',
 'أكتب برامج CLI بسعادة مع مكتبة Click في لغة البايثون – تطبيق عملي': 'https://tinyurl.com/yyzmumqy',
 'أمن المعلومات في البايثون – أهم المكتبات البايثونية لأمن المعلومات': 'https://tinyurl.com/y3z2be8w',
 'إستخراج البيانات من صفحات الإنترنت بلغة البايثون – لمحة سريعة': 'https://tinyurl.com/y3b5ortl',
 'ادارة مكتبات بايثون وطريقة تثبيتها': 'https://tinyurl.com/y49tkqfh',
 'البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة': 'https://tinyurl.com/y3lgh7ss',
 'البرمجة الكائنية في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://tinyurl.com/yxlydsdc',
 'التسجيل Logging في البايثون – الدليل البسيط': 'https://tinyurl.com/y2u975kf',
 'التعامل مع الريجستري في الويندوز من خلال لغة البايثون': 'https://tinyurl.com/y492j2g4',
 'الدوال والوحدات في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://tinyurl.com/y67ckmps',
 'المتغيرات في بايثون وكيفية التعامل مع التراكيب – سلسلة بايثونات لتعلم لغة البايثون': 'https://tinyurl.com/y5xv3ds8',
 'المزخرفات في بايثون – كيف نتعامل مع دوال بايثون بحُرية أكثر': 'https://tinyurl.com/y6gqsdeh',
 'المفكرة التفاعلية في بايثون – Jupyter NoteBook': 'https://tinyurl.com/y4gowdm9',
 'النصوص في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://tinyurl.com/yx8r7k8z',
 'اوامر لغة بايثون لنظام التشغيل من خلال مكتبة subprocess': 'https://tinyurl.com/y474u84v',
 'بايثون اناكوندا – أسهل الطُرق لتثبيت المكتبات العلمية في البايثون': 'https://tinyurl.com/yyn57ldz',
 'بايثون والمرونة في البرمجة – الدليل الشامل لفهم comprehensions في البايثون': 'https://tinyurl.com/y4blf5vy',
 'برمجة الشبكات بالبايثون – كيف تُرسل أوامر لعدة أجهزة عبر الشبكة': 'https://tinyurl.com/yyj42hsh',
 'تحليل البيانات باستخدام بايثون – سجلات الوفيات والاصابات بفيروس كورونا كمثال': 'https://tinyurl.com/y3t75z7j',
 'تطبيقات البايثون في التعامل مع محرر النصوص مايكروسوفت وورد': 'https://tinyurl.com/y4ltokj3',
 'تطبيقات بايثون – كيف تُرسل بريد إلكتروني مع مرفق في البايثون': 'https://tinyurl.com/y6pcqdv7',
 'تطبيقات لغة البايثون – تعلم كيف تبني إضافات plugins لبرنامج بايثون': 'https://tinyurl.com/yxfybvbj',
 'جُمل التحكم في بايثون – سلسلة بايثونات لتعلم لغة البايثون للمبتدئين': 'https://tinyurl.com/y4gq7crs',
 'شركات وبايثون – Netflix وطريق الترفيه الذي يمر عبر البايثون': 'https://tinyurl.com/y5yqd4x7',
 'قواعد البيانات SQLite والبايثون – كيف تُنشئ قاعدة بيانات وتتعامل معها': 'https://tinyurl.com/y32lyqzh',
 'قواعد البيانات الأوراكل والبايثون –كيف نتعامل مع الاوراكل من كود بايثون': 'https://tinyurl.com/yyftw59t',
 'كيف تبني RESTful API باستخدام إطار البايثون Django': 'https://tinyurl.com/y2ndszdn',
 'كيف تتعامل مع بيانات JSON في لغة بايثون': 'https://tinyurl.com/y2y47agg',
 'لغة البرمجة بايثون والتعامل مع نظام التشغيل من خلال مكتبة os': 'https://tinyurl.com/y3g4mjuq',
 'لغة بايثون للمبتدئين – سلسلة بايثونات لتعلم البايثون': 'https://tinyurl.com/y5m5chj8',
 'لغة بايثون والتعامل مع الملفات من حيث الكتابة والقراءة والتعديل': 'https://tinyurl.com/y6kxvqx5',
 'معالجة الأخطاء في بايثون – سلسلة بايثونات لتعلم لغة البايثون': 'https://tinyurl.com/y3rgj4ul',
 'مكتبات علم البيانات بالبايثون | 5 مكتبات مشهورة': 'https://tinyurl.com/y6l22vxq',
 'مكتبة Matplotlib – الخطوة الثالثة في علم البيانات بالبايثون': 'https://tinyurl.com/y37ojy9p',
 'مكتبة Numpy – الخطوة الأولى في علم البيانات بلغة البايثون': 'https://tinyurl.com/yy7nvxn3',
 'مكتبة OpenCV بالبايثون وكيفية اختبار وجود عناصر معينة': 'https://tinyurl.com/y2swpkdx',
 'مكتبة Pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الأول': 'https://tinyurl.com/y4fydxcb',
 'مكتبة pandas – الخطوة الثانية في علم البيانات بلغة البايثون – الجزء الثاني': 'https://tinyurl.com/yy85fly5',
 'مكتبة requests في البايثون – كيف تُرسل طلبات HTTP من بايثون': 'https://tinyurl.com/y4vc7adb',
 'مكتبة scikit-learn – لمحة سريعة عن مكتبة البايثون لتعليم الآلة': 'https://tinyurl.com/y4y4sb35'}

لنقم باستدعاء مكتبة pandas والتي من خلالها سنقوم بتخزين ما قمنا بتحصيله سابقا في إطار بيانات ومن ثم في ملف csv، لكن لابد من القيام بعدة تحضيرات لذلك.

في البداية، لنقم بإنشاء قاموس جديد فارغ ليتم ملؤه بشكل خاص مغاير لما سبق حتى يتسنى لنا أن نحوله إلى إطار بيانات pandas بشكل تلقائي. سننشيء مفتاح إسمه articles لتكون قيمتة جميع المفاتيح من القاموس السابق، ومفتاح آخر إسمه url لتكون قيمته جميع القيم للمفاتيح في القاموس السابق.

و النتيجة من ذلك هو قاموس جاهز لتحويله لإطار بيانات عن طريق السطر التالي والذي من خلاله أنشأنا إطار بيانات وفي بنفس السطر استدعينا دالة خاصة تمكننا من إنشاءها من قاموس وهي الدال from_dict.

df = pd.DataFrame.from_dict(final_d)

و أخيرا ، لنقم بتحويل تلك إطار البيانات إلى ملف csv بالأمر التالي و نعطيه اسما في مسار مناسب له :

df.to_csv("/content/drive/MyDrive/Pythonat_stuff/pythonat_scrape.csv",index=False)

و في الختام، من خلال هذا المقال تعرفنا على مكتبة requests-html واستطعنا بناء برنامج متكامل على الرغم من بساطته يقوم بتحصيل معلومات من مدونة بايثونات وتخزين تلك المعلومات بطريقة سهلة عبر عدة طرق مختلفة حتى نستخدمها في أي مشروع مستقبلي قريبا إن شاء الله.

دمتم سالمين

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *