الدرس الثالث من كيفية التعامل مع صفحات الويب في لغة البرمجة python: طلب الصفحة بواسطة بايثون والحصول عليها.

يُقدم لكم هذه الدروس: الأستاذ إبرهيم حمادة جزاه الله خيرا.
لقد تحدثنا عن استخدام المتصفح لِطلب صفحة الوب
و قلنا أنَّ الرد أو ال response
يأتي إلينا بصيغةِ html.
كيف نطلب و نحصل على صفحة الوب بواسطة بايثون؟
هنا نحن نتكلم عن بايثون3
الموضوع يختلف قليلا في بايثون2
لذلك علينا أن نتذكر أننا نستخدم هنا بايثون3
في البداية أرجو أن نفتح هذه الصفحة بالمتصفح و نراها:
example_page_url= 'http://www.example.com'
و هذه الصفحة موجودة على الوب فقط لِنتمرَّن عليها
بعد فتحها بالمتصفح نراها هكذا:
```
Example Domain
This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
More information...
```
هي صفحة صغيرة و بسيطة
و لكن لنتذكر أنَّ المتصفح يُظهر فقط ال body أو جسم الصفحة
و الصفحة بصيغة html, تحتوي أيضا على معلومات أخرى موجودة في ال head, أو الرأس.
طيب نحن الآن سنحاول طلب هذه الصفحة بواسطة بايثون
صفحة ال example, http://www.example.com

أولا نستورد مكتبة urllib.request
import urllib.request
# سنطلب صفحة ال example
url= 'http://www.example.com'
response= urllib.request.urlopen(url)
بهذه الطريقة نحصل على الرد, أوو صفحة الوب
الآن ال response هو كائن, object
تماما مثل ال file object, أو كائن الملف
طيب نحن في الملفات كيف نحصل على كافة النص الموجود في الملف؟
نعم بالوظيفة read()
و هنا نفس الشيء, نستخدم الوظيفة read() للحصول على محتوى أو صفحة الوبْ هذه
html= response.read()
نريد أن نرى الصفحة بصيغة html, على سطر الأوامر
print(html)
--
سأنسسخ الكود هذا , و أُلصقه في بوابة بايثون:
import urllib.request

url= 'http://www.example.com'
response= urllib.request.urlopen(url)
html= response.read()
print(html)

النتيجة:
```
b'\n\n\n    Example Domain\n\n    \n    \n    \n        \n\n\n\n
\n

Example Domain

\n

This domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.

\n

More information...

\n
\n\n\n' ``` و هذه هي الصفحة بصيغة html طبعا. --- عند طباعة الصفحة, أو محتوى ال html لاحظوا أن النص يبدأ بالحرف b b'\n... يعني هذا النص هو مِن نوع bytes و ليس سلسلة نصية عادية, string و كان مِن المفروض تحويله إلى سلسلة نصية قبل طباعته و كي نُحَوِّلُه إلى سلسلة نصية, علينا أن نعرف قبلا, ال encoding أو الترميز الخاص به. و في المثال السابق, عند طباعة الصفحة ربما لم يكن هناك مشكلة, لِأن الترميز الخاص به كان 'utf-8' و لكن لو كان الترميز شيء آخَر, للأحظنا أنّ الصفحة مليئة بالرموز الغريبة, و مِن الصعب قراءتها. -كيفية معرفة ال encoding أو الترميز للصفحة التي نطلبها: لقد قلنا مِن قبل أنّ الرد أو ال response هو كائن. و قلنا أنه يأتي مع الرد معلومات أخرى عن الصفحة و هي ال headers أو رأس الرد. و في الغالب فإن ترميز الصفحة يكون بين هذه المعلومات. سأعيد طلب الصفحة مِن جديد على بوابة بايثون: >>> import urllib.request >>> url= 'http://www.example.com' >>> response= urllib.request.urlopen(url) >>> response.headers.get_content_charset() 'utf-8' إذاً بهذه الطريقة نحصل على ترميز الصفحة, يعني response.headers.get_content_charset() و كما ظهر لنا أنّ ترميزها كان هو 'utf-8' لذلك نعود و نقول أنه عند طباعة الصفحة, كان مِن الأفضل فك شفرتها قبل طباعتها و فك الشفرة يكون بالدالة decode() الآن سأقوم بطلب الصفحة, و طباعتْ جزء منها بعد فك شفرتها و تحويلها إلى سلسلة نصية. >>> import urllib.request >>> url= 'http://www.example.com' >>> response= urllib.request.urlopen(url) # الآن سنقوم بمعرفة ترميز الصفحة >>> page_encoding= response.headers.get_content_charset() >>> htmlAsBytes= response.read() # htmlAsBytes هو محتوى الصفحة و لكن مِن نوع bytes. # الآن سنفُك شفرة الصفحة و نُحَوِّلها إلى سلسلة نصِيَّة >>> html= htmlAsBytes.decode(page_encoding) # تعالوا نعرف نوع النص الآن >>> type(html) # يا سلام هو string أو سلسلة نصية. # الآن سأقوم بطباعة جزء مِن الصفحة # هذا الجزء يبدأ بالكلمة '', إلى آخِر الصفحة. >>> position= html.find('') >>> print(html[position:]) النتيجة:

Example Domain

This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.

More information...

- معلومات أخرى يمكن أن نحصل عليها مِن كائن الرد, أو ال response للا نزال على بوابة بايثون و كنا سابقا قد طلبنا الصفحة, و كائن الرد ما زال موجودا >>> response >>> response.code 200 >>> response.reason 'OK' 200 OK, يعني أن الصفحة موجودة و حصلنا عليها, و كل الأمور تمام. و طبعا تعرفون أحيانا الرسالة التي تظهر لكم و تقول 404 Page Not Found و مِن هنا نعرف, أنّ هذه المعلومات يمكن أن نحصل عليها مِن كائن الرد أو ال response. -الاطِّلاع على ال headers أو رأس الرد. طيب أنت قلتَ لنا أنّ هناك معلومات تأتي مع الرد, و هي ال headers, طيب كيف نحصل عليها لذلك سنعود إلى بوابة بايثون كائن الرد, أو ال response لا يزال موجودا مِن المرة السابقة >>> response >>> headers= response.getheaders() >>> headers [ ('Age', '339701'), ('Cache-Control', 'max-age=604800'), ('Content-Type', 'text/html; charset=UTF-8'), ('Date', 'Wed, 02 Feb 2022 09:51:13 GMT'), ('Etag', '"3147526947+ident"'), ('Expires', 'Wed, 09 Feb 2022 09:51:13 GMT'), ('Last-Modified', 'Thu, 17 Oct 2019 07:18:26 GMT'), ('Server', 'ECS (dcb/7EEA)'), ('Vary', 'Accept-Encoding'), ('X-Cache', 'HIT'), ('Content-Length', '1256'), ('Connection', 'close') ] و كما رأينا أنَّ ال headers هي قائمة مِن tuples أول عنصر مِن ال tuple, هو نوع المعلومة التي نريدها, مثل حجم الصفحة أو نوع المحتوى أو الترميز أو الوقت الذي طلبنا فيه الصفحة, أو غير ذلك. و العنصر الثاني هو قيمة ذلك. تمرين1: إعمل كود 1. أُطلب به صفحة جوجل 'http://www.google.com' 2. إستخلِص محتوى الصفحة, بالوظيفة read() 3.إْطبَع نوع أو type محتوى الصفحة أو النص المُستخلَص. 4. مِن خِلال كائن الرد أو ال response, إطبع الترميز أو ال encoding الخاص بالصفحة 5.إطبَع response.status و response.code تمرين2: إعمل كود 1. أُطلب به صفحة nvda العربي 'https://www.nvda-ar.org' 2. مِن خِلال كائن الرد أو ال response, إطبع response.code و response.reason 3. إحصل على محتوى الصفحة بصيغة bytes, بواسطة الوظيفة read() 4. إطبع نوع الترميز أو ال encoding للصفحة 5. حوِّل محتوى الصفحة إلى سلسلة نصية باستخدام الوظيفة decode() 6.الآن بعد تحويل الصفحة إلى سلسلة نصية, إطبع الجزء مِن الصفحة الذي يبدأ بِ العبارة '

' إلى آخِر الصفحة. ونلتقي مع درس آخر قريبا بمشيئةِ الله.

تعليقات

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

    ردحذف
  2. شكرا لكاتب المقال و ناشره و جازاكما الله كل الخير ، دروس مهمة و نحن بحاجة أكيدة لها .

    ردحذف
  3. الشكر لله.
    والحمد لله، فهذا ما نرجوه بالتأكيد.

    ردحذف

إرسال تعليق

ما من كاتبٍ سيَبلى
ويُبقي الدهرُ ما كتبت يَداه
فلا تكتُبَنَّ بيديكَ غيرَ شيءٍ
يسُرُكَ في القيامةِ أن تراه.