Python الوصول إلى الإنترنت باستخدام Urllib.Request وurlopen()

⚡ ملخص ذكي

urllib هو المعيار Python وحدة للوصول إلى بيانات الإنترنت، مما يسمح للبرامج بفتح URLويمكنها استرجاع محتوى HTML أو JSON أو المحتوى الثنائي. تتصل الدالة urllib.request.urlopen() بعنوان ويب وتقرأ استجابة الخادم مباشرةً في Python.

  • 🔘 المكتبة القياسية: مكتبة urllib تأتي مع Python ويشمل ذلك وحدات الطلب والخطأ والتحليل ووحدة تحليل الروبوت لـ URL المهام.
  • ☑️ فتح URL: تقوم الدالة urllib.request.urlopen() بفتح اتصال، وتقوم الدالة getcode() بإرجاع حالة HTTP مثل 200.
  • اقرأ الرد: تقوم الدالة read() بإرجاع البايتات الخام، والتي تقوم الدالة decode(“utf-8”) بتحويلها إلى نص قابل للقراءة.
  • 🧪 معالجة الأخطاء: التقاط خطأ HTTP URLخطأ من مكتبة urllib.error، لذا فإن الطلبات الفاشلة لا تتسبب أبدًا في تعطل البرنامج.
  • 🛠️ تحميل ملفات: تقوم الدالة urlretrieve() بحفظ أي URL مباشرة إلى القرص، مثالي للصور وملفات PDF ومجموعات البيانات.
  • 🤖 جاهز للذكاء الاصطناعي: تقوم مكتبة urllib بجلب مجموعات البيانات وبيانات واجهة برمجة التطبيقات التي تغذي نماذج التعلم الآلي وخطوط أنابيب الذكاء الاصطناعي.

Python الوصول إلى الإنترنت باستخدام Urllib

تشرح الأقسام التالية ماهية مكتبة urllib، وكيفية فتحها URL وقراءة كود HTML الخاص به، وكيفية التعامل مع الأخطاء، وتنزيل الملفات، والاختيار بين مكتبة urllib ومكتبة requests.

ما هو urllib؟

urllib هو أ Python وحدة يمكن استخدامها لفتح URLيُعرّف هذا البرنامج الدوال والفئات للمساعدة في URL الإجراءات.

مع Pythonيمكنك أيضًا الوصول إلى البيانات واسترجاعها من الإنترنت، مثل XML وHTML وJSON، ثم التعامل معها مباشرةً. سنرى في الأقسام التالية كيفية استرجاع البيانات من الويب. على سبيل المثال، سنستخدم هنا... Guru99 الفيديو URL، يمكنك الوصول إليه باستخدام Pythonواطبع ملف HTML الخاص بهذا URL.

تضم حزمة urllib عدة وحدات: urllib.request لفتح URLs، urllib.error للاستثناءات التي قد تثيرها الطلبات، urllib.parse للبناء والتحليل URLs، و urllib.robotparser لقراءة ملفات robots.txt.

كيفية فتح URL باستخدام Urllib

قبل تشغيل الكود للاتصال ببيانات الإنترنت، نحتاج إلى استيراد URL وحدة المكتبة، أو "urllib".

ساعات العمل URL باستخدام Urllib

  • استيراد urllib
  • تحديد وظيفتك الرئيسية
  • قم بتعريف المتغير webUrl
  • ثم استدعِ الدالة urlopen في مكتبة urllib
  • استخدم URL سنفتتح Guru99 درسًا تعليميًا حول YouTube
  • بعد ذلك، نقوم بطباعة رمز النتيجة
  • يتم استرداد رمز النتيجة عن طريق استدعاء دالة getcode على متغير webUrl الذي أنشأناه
  • نقوم بتحويل ذلك إلى سلسلة نصية، بحيث يمكن دمجها مع سلسلة "رمز النتيجة" الخاصة بنا.
  • سيكون هذا رمز HTTP عاديًا "200"، مما يشير إلى أن طلب HTTP قد تمت معالجته بنجاح.

كيفية الحصول على ملف HTML من URL in Python

يمكنك أيضًا قراءة ملف HTML باستخدام الدالة read() في Pythonعند تشغيل الكود، سيظهر ملف HTML في وحدة التحكم.

ملف HTML من URL in Python

  • قم باستدعاء الدالة read() على متغير webUrl
  • تتيح لك الدالة read() قراءة محتويات ملفات البيانات
  • اقرأ المحتوى الكامل لـ URL في متغير يسمى البيانات
  • قم بتشغيل الكود وسيقوم بطباعة البيانات بتنسيق HTML

ها هو الكود الكامل:

Python 2 مثال

#  
# read the data from the URL and print it
#
import urllib2

def main():
# open a connection to a URL using urllib2
   webUrl = urllib2.urlopen("https://www.youtube.com/user/guru99com")
  
#get the result code and print it
   print "result code: " + str(webUrl.getcode()) 
  
# read the data from the URL and print it
   data = webUrl.read()
   print data
 
if __name__ == "__main__":
  main()

Python 3 مثال

#
# read the data from the URL and print it
#
import urllib.request
# open a connection to a URL using urllib
webUrl  = urllib.request.urlopen('https://www.youtube.com/user/guru99com')

#get the result code and print it
print ("result code: " + str(webUrl.getcode()))

# read the data from the URL and print it
data = webUrl.read()
print (data)

كيفية التعامل مع أخطاء مكتبة urllib: URLخطأ وخطأ HTTP

لا تنجح جميع الطلبات. فعندما يحدث خطأ ما، تُصدر مكتبة urllib استثناءً بدلاً من إرجاع البيانات، لذا من المهم معالجة هذه الأخطاء. يُعرّف مُكوّن urllib.error فئتين رئيسيتين من الاستثناءات.

  • خطأ HTTP يتم رفع هذا الاستدعاء عندما يُعيد الخادم رمز حالة خطأ، مثل 404 غير موجود أو 500 خطأ داخلي في الخادم. ويحمل رمز الحالة ونص الاستجابة.
  • URLخطأ يُثار هذا الخطأ عندما يتعذر الوصول إلى الخادم نهائياً، على سبيل المثال بسبب اسم نطاق خاطئ أو انقطاع الاتصال بالإنترنت. ويحتوي على سمة "السبب" التي توضح سبب الفشل.

لأن HTTPError هو فئة فرعية من URLفي حالة حدوث خطأ، يجب دائمًا التقاط خطأ HTTP أولاً حتى يتم التعامل مع كل نوع من أنواع الأخطاء بشكل منفصل:

from urllib.request import urlopen
from urllib.error import HTTPError, URLError

try:
    response = urlopen("https://www.guru99.com/no-such-page.html")
    data = response.read()
except HTTPError as error:
    print("HTTP error:", error.code)
except URLError as error:
    print("URL error:", error.reason)

إن معالجة هذه الاستثناءات تمنع برنامجك من التعطل وتتيح لك تسجيل المشكلة، أو إعادة محاولة الطلب، أو الرجوع إلى البيانات المخزنة مؤقتًا.

كيفية تنزيل ملف من URL باستخدام مكتبة urllib

قراءة URL يُعدّ التخزين في الذاكرة مناسبًا للصفحات الصغيرة، ولكن بالنسبة للصور أو ملفات PDF أو مجموعات البيانات، يُفضّل حفظ الاستجابة مباشرةً على القرص. توفر وحدة urllib.request طريقتين بسيطتين للقيام بذلك.

تقوم الدالة urlretrieve() بتنزيل URL مباشرةً إلى ملف محلي في سطر واحد:

from urllib.request import urlretrieve

urlretrieve("https://www.python.org/static/img/python-logo.png", "logo.png")

لمزيد من التحكم، افتح URL واكتب البايتات بنفسك. افتح الملف المحلي في الوضع الثنائي لأن الدالة urlopen() تُرجع بايتات، وليس نصًا.

from urllib.request import urlopen

with urlopen("https://example.com/data.zip") as response:
    with open("data.zip", "wb") as file:
        file.write(response.read())

بالنسبة للملفات الكبيرة جدًا، اقرأ واكتب في حلقة باستخدام response.read(8192) بحيث لا يتم الاحتفاظ بالملف بأكمله في الذاكرة في وقت واحد.

مكتبة urllib مقابل مكتبة requests في Python

مكتبة urllib هي جزء من Python مكتبة قياسية، لذا فهي تعمل في كل مكان دون تثبيت. مكتبة الطلبات الخارجية غير مدمجة، لكن العديد من المطورين يفضلونها للعمل اليومي مع بروتوكول HTTP لأن صيغتها أقصر وأكثر وضوحًا.

الاختلافات الرئيسية هي:

  • تركيب: مكتبة urllib تأتي مع Pythonبينما يجب تثبيت الطلبات باستخدام pip.
  • فك: تقوم مكتبة urllib بإرجاع البايتات الخام التي تقوم بفك تشفيرها بنفسك، بينما تقوم مكتبة requests بفك تشفير النصوص و JSON تلقائيًا.
  • الراحة: تتعامل مكتبة requests مع الجلسات وملفات تعريف الارتباط والعناوين المخصصة باستخدام كود أقل.
  • تبعيات: لا يضيف urllib أي شيء، بينما تعتمد الطلبات على urllib3 في الأساس.

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

الأسئلة الشائعة

تُعيد الدالة urlopen() كائن استجابة HTTP، وعادةً ما يكون من نوع http.client.HTTPResponse. يمكنك استدعاء الدالة read() للحصول على البايتات الخام، والدالة getcode() لقراءة رمز الحالة، والدالة headers أو info() لفحص البيانات الوصفية مثل نوع المحتوى وطوله.

urllib2 ينتمي إلى Python 2. في Python 3- تمت إعادة تنظيمها: تم تقسيم ميزاتها إلى urllib.request لفتح URLs و urllib.error للاستثناءات. Code يجب تحديث الكود المكتوب لـ urllib2 لاستيراد urllib.request بدلاً من ذلك.

تُعيد الدالة read() بايتات، وليس سلسلة نصية، لأن الدالة urlopen() لا تعرف الترميز مسبقًا. يُحوّل استدعاء الدالة decode(“utf-8”) هذه البايتات إلى نص قابل للقراءة، مما يُتيح لك طباعة محتوى HTML أو JSON أو البحث فيه أو تحليله.

فتح URL باستخدام الدالة urlopen()، اقرأ البايتات، ثم فك تشفيرها، ثم حللها باستخدام وحدة json: json.loads(response.read().decode(“utf-8”)). هذا يُعيد Python قاموس أو قائمة يمكنك استخدامها مباشرة، وهو أمر شائع عند استدعاء واجهات برمجة تطبيقات الويب.

لف URL في كائن urllib.request.Request، أضف الترويسة قبل فتحه: request.add_header(“User-Agent”, “Mozilla/5.0”)، ثم مرر الطلب إلى urlopen(). تساعد الترويسات المخصصة عندما يحظر الخادم الترويسات الافتراضية. Python وكيل المستخدم.

نعم، يمكن لمكتبة urllib جلب مجموعات البيانات وملفات CSV وJSON من واجهات برمجة تطبيقات الويب، والتي تقوم بعد ذلك بفك تشفيرها وتحميلها إلى مكتبتي pandas أو NumPy. إنها طريقة خفيفة الوزن ولا تعتمد على أي مكتبات أخرى لجلب بيانات التدريب إلى مسار تعلم الآلة.

نعم. يقوم GitHub Copilot بإكمال أنماط urllib الشائعة تلقائيًا، مثل استدعاءات urlopen()، وكائنات Request، ومعالجة الأخطاء باستخدام try/except. هذا يُسرّع عملية كتابة التعليمات البرمجية المتكررة، ولكن لا يزال عليك التحقق من ذلك. URLيقترح مساعد الذكاء الاصطناعي معالجة الاستثناءات، بما في ذلك العناوين والملفات.

قم بتشفير معلماتك باستخدام urllib.parse.urlencode()، ثم حوّلها إلى بايتات باستخدام encode()، ثم مررها كوسيط بيانات إلى urlopen() أو كائن Request. يؤدي توفير البيانات تلقائيًا إلى إرسال urllib طلب POST بدلاً من GET.

تلخيص هذه التدوينة بـ: