مقدمة لمكتبة urllip

إن وحدة urllip في بايثون 3 عبارة عن عن محموعة من الوحدات التي يمكننا إستخدامها للتعامل مع الروابط ، وإذا كنت قادم من بايثون 2 ستجد أن بايثون 2 لديها urllip و urllip2  أما في بايثون 3 أصبحوا عبارة عن حزمة واحدة تحت إسم urllip ويتكون الإصدار الحالي من :

  • urllib.request
  • urllib.error
  • urllib.parse
  • urllib.rebotparser

سنقوم بتغطية كل جزء ماعدا urllib.error 

urllib.request

تستخدم هذه الوحدة أساسا لفتح وجلب الروابط ، دعونا نقوم ببعض الأمثلة لنرى مالذي يمكننا فعله مع وظيفة urlopen


>>>import urllib.request
>>> url = urllib.request.urlopen('https://www.google.com/')
 >>>url.geturl()
'https://www.google.com/'
>>>url.info()
lt;http.client.HTTPMessage object at 0x7fddc2de04e0
>>> header = url.info()
>>>header.as_string()
('Date: Fri, 24 Jun 2016 18:21:19 GMT\n'
'Expires: -1\n'
'Cache-Control: private, max-age=0\n'
'Content-Type: text/html; charset=ISO-8859-1\n'
'P3P: CP="This is not a P3P policy! See '
'https://www.google.com/support/accounts/answer/151657?hl=en for more info."\n'
'Server: gws\n'
'X-XSS-Protection: 1; mode=block\n'
'X-Frame-Options: SAMEORIGIN\n'
'Set-Cookie: '
'NID=80=tYjmy0JY6flsSVj7DPSSZNOuqdvqKfKHDcHsPIGu3xFv41LvH_Jg6LrUsDgkPrtM2hmZ3j9V76pS4K_
cBg7pdwueMQfr0DFzw33SwpGex5qzLkXUvUVPfe9g699Qz4cx9ipcbU3HKwrRYA; '
'expires=Sat, 24-Dec-2016 18:21:19 GMT; path=/; domain=.google.com; HttpOnly\n'
'Alternate-Protocol: 443:quic\n'
'Alt-Svc: quic=":443"; ma=2592000; v="34,33,32,31,30,29,28,27,26,25"\n'
'Accept-Ranges: none\n'
'Vary: Accept-Encoding\n'
'Connection: close\n'
'\n')
>>> url.getcode()
200

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

بعد ذلك قمنا بإستدعاء  info والذي سيعرض بيانات وصفية حول الصفحة مثل معلومات حول headers وهكذا يمكننا تعيين نتيجة هذا الأخير لمتغير headers ثم نقوم بمناداة as_string وهذا سيقوم بعرض header المستقبل من موقع قوقل ، يمكننا أيضا الحصول على رمز الإستجابة الخاص ب HTTP بإستدعائنا ل getcode وفي حالتنا هذه هو عبارة عن 200 وهذا يعني نجاح العملية .

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

يرجى أيضا الـتأكد من أن كائن الطلب الإفتراضي هو GET مالم يتم تحديد خيارات البيانات .

تحميل ملف 

أهم إستخدامات حزمة  urllib هو تحميل الملفات فدعونا نارى بعض الأمثلة لتحقيق ذلك


>>> import urllib.request
>>>url = 'http://www.pyarab.com/wp-content/uploads/2016/07/n.zip'
>>>response = urllib.request.urlopen(url)
>>> data = response.read()
>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:
... fobj.write(data)
...

هنا قمنا بفتح الرابط الذي يقودنا إلى الملف المطلوب للتحميل ثم نقوم بقراءة البيانات وبالتالي تتم عملية التحميل .

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


>>> import urllib.request
>>> url = 'http://www.pyarab.com/wp-content/uploads/2016/07/n.zip'
>>> urllib.request.urlretrieve(url, '/home/mike/Desktop/blog.zip')
('/home/mike/Desktop/blog.zip',
 <http.client.HTTPMessage object at 0x7fddc21c2470>)

هذه الطريقة ستقوم بنسخ كائن الشبكة إلى الملف المحلي ويتم تسمية الملف المنسوخ عشوائيا ويتم نسخه على دليل مؤقت إلا في حالة إستخدام خيارات خاصة لتجعله يقوم بحفظ الملف في دليل معين :


>>> import urllib.request
>>> url = 'http://www.blog.pythonlibrary.org/wp-content/uploads/2012/06/wxDbViewer.zip'
>>> tmp_file, header = urllib.request.urlretrieve(url)
>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:
...     with open(tmp_file, 'rb') as tmp:
...         fobj.write(tmp.read())

وكما ترى فإنه في الأخير يقوم بعرض عنوان الدليل التي حفظ الملف عليه بالإضافة إلى معلومات رأس الطلب .

تحديد وكيل المستخدم الخاص بك

عندما تقوم بزيارة موقع ما من خلال المتصفح فإن هذالإخير يخبر الموقع من هو ، وهذا مايسمى بسلسلة user-agent ، مكتبة بايثون urllip تقوم بتحديد نفسها ك : Python-urllib/x.y حيث أن X و Y رقم إصدار بايثون الرئيسي والثانوي ، بعض المواقع لن تتعرف على سلسلة وكيل المستخدم وستتصرف بطريقة غريبة أو لن تعمل على الإطلاق .

لحسن الحظ يمكن إعداد سلسلة وكيل المستخدم خاص بك :


>>> import urllib.request
>>> user_agent = ' Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0'
>>> url = 'http://www.pyarab.com/'
>>> headers = {'User-Agent': user_agent}
>>> request = urllib.request.Request(url, headers=headers)
>>> with urllib.request.urlopen(request) as response:
...     with open('/home/mdriscoll/Desktop/user_agent.html', 'wb') as out:
...         out.write(response.read())

هنا قمنا بتعيين وكيل مستخدم لموزيلا فايرفوكس وقمنا بتعيين الموقع الذي نريد منه إختبار وكيل المستخدم الخاص بنا ، بعد ذلك قمنا بتعيين طلب بإستخدام رابطنا والرأس ومررناه إلى urlopen وأخير قمنا بحفظ الناتج وإذا قمت بفتح ملف الذي يحتوي على الناتج ستجد أننا قمنا بتغيير سلسلة وكيل المستخدك بنجاح .

حاول أن تجرب تغيير وكيل المستخدم عدة مرات مع هذا الكود حتى تفهم ألية العمل .

urllib.parse

تعتبر مكتبة urllib.parse هي الواجهة القياسية لتفكيك سلاسل الروابط و إعادة ربطهم مرة أخرى ويمكن أيضا إستخدامها لتحويل الروابط النسبية إلى روابط مطلقة ، دعونا نأخذ مثال عن تحليل الرابط يحتوي على علامة إستفهام


>>> from urllib.parse import urlparse
>>> result = urlparse('https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa')
>>> result
ParseResult(scheme='https', netloc='duckduckgo.com', path='/', params='', query='q=python+stubbing&t=canonical&ia=qa', fragment='')
>>> result.netloc
'duckduckgo.com'
>>> result.geturl()
'https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa'
>>> result.port
None

قمنا بإستدعاء وظيفة urlparse ومررناها إلى رابط يحتوي على علامة إستفهام والتي نسأل من خلالها على python stubbing وكان الناتج عبارة عن كائن ParseResult والذي يكمن إستخدامه للمزيد من المعلومات عن الرابط (رقم المنفذ،مكان السبكة،المسار إلخ…).

تقديم نموذج ويب 

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


>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'q': 'Python'})
>>> data
'q=Python'
>>> url = 'http://duckduckgo.com/html/'
>>> full_url = url + '?' + data
>>> response = urllib.request.urlopen(full_url)
>>> with open('/home/mike/Desktop/results.html', 'wb') as f:
...     f.write(response.read())

مثال واضح وصريح ففي الأساس نريد تقديم إستعلام ل  duckduckgo بإنفسنا بإستخدام بايثون بدلا من المتصفح ولفعل ذلك نحتاج إلى بناء سلسلة إستفهام بإستخدام urlencode ثم نقوم بجمع كل ذلك لنشكل رابط مؤهل تماما ثم نقوم بإستخدام urllib.request لتقديم نموذج الويب بعد ذلك نقوم بالإستيلاء على النتيجة وحفظها .

 

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

أرجوا أن تقوم بدعمنا عبر نشرك والاعجاب بالموقع

اترك تعليقاً

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

Post Navigation