مكتبة urllib للتعامل مع الويب في بايثون
مكتبة ( urllib ) هي مكتبة تُمكننا في التعامل مع الويب, سوف نتكلم اليوم عن المكتبات التي تُستخدم للتعامل مع الويب التي نستفيد منها في إختبار الإختراق penetration testing. توجد الكثير من المكتبات التي نتعامل بها مع الويب لكن سوف نشرح اشهرها في عدة دروس قادمة, و أشهر هذه المكتبات هي:
- مكتبة urllib.
- مكتبة requests.
- مكتبة selenium.
- مكتبة BeautifulSoup أو bs4.
لكن بدرسنا هذا سوف نتكلم عن اول هذه المكتبات و هي urllib.
ما هي مكتبة urllib في بايثون
يقصد بمكتبة urllib مثلاً نتكلم مع الطلبات التي نتعامل بها مع الويب مثل get request, مثل طلب معلومات من موقع معيّن website او اي شي خاص داخل الويب.
>>> import urllib.request >>> url = "https://www.nusurtech.ca" >>> request = urllib.request.urlopen(url) >>> request.read()[0:40] b"<!DOCTYPE html>\n<html dir='rtl' lang='ar" >>> request = urllib.request.urlopen(url) >>> request.read()[0:100] b"<!DOCTYPE html>\n<html class='v2' dir='rtl' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www." >>> request = urllib.request.urlopen(url) >>> len(request.read()) 291339
في البداية إستدعينا المكتبة المطلوبة request و ثم إستدعينا رابط موقعنا عبر url و قرأنا من السورس كود من 0 حتى 40 من الإندكس و بعده قرأنا من 0 حتى 100 و من ثم قرأنا الـ len الخاص بسورس الموقع.
إرجاع الأخطاء urllib.error في بايثون
لإرجاع urllib.error نستخدم هذا في exception و نستخدمه في حال كتابتنا لكود ضخم إذا إنوجد به أي خطأ يتم إرجاعه لنا بطريقة سهله و معرفة مكان الخطاً. و يوجد نوعين من الأخطاء error و هي URLEerror و HTTPError لذلك نستدعي مكتبة urllib.error. و الفرق بين النوعين هو في URLEerror هو الأخطاء التي تظهر مثل 403 و 404 و غيرها, أما HTTPError في حال كتبنا نحن الرابط بشكل خاطئ أو غير موجود ينبهنا بهذا.
import urllib.request import urllib.error try: url = "https://www.yahoo.com/" response = urllib.request.urlopen(url) print(response.read(100)) except urllib.error.URLError as e: print(e) except urllib.error.HTTPError as e: print(e.code) print(e.url) print(e.reasone)
في البداية عملنا import إستدعاء المكتبات urllib.request و urllib.error و بعدها قلنا له عبر try افتح لنا موقع Yahoo و معنى الأخطاء ذكرناها سابقاً و خزنناها في متغير و طبعناها عبر دالة الطبع print.
عرض الهيدرز للموقع HTTP header
يتم إستخدامه لمعرفة الهيدرز الخاص بموقع ما
>>> import urllib.request >>> re = urllib.request.urlopen("https://www.google.com") >>> re.getheaders()
عند الضغط على زر Enter سوف يعرض لنا الهيدرز header كما بالصورة
ستكون كل هذه بيانات النتيجة مهمة و منها الكوكيز و الدومين ....الخ. و لعرض الكوكيز هنا نستخدم الأمر re.getheader('Set-Cookie').
>>> re.getheader('Set-Cookie') '1P_JAR=2020-05-12-16; expires=Thu, 11-Jun-2020 16:07:30 GMT; path=/; domain=.google.com; Secure, NID=204=eB_QyCFSqN5tpl56kzfPQBc5LCJ37WqvYqUBeREGbepvZy0xjNmmu8OuvbOKMzHTyTcy0fwmuIWYflDL10X_RDtjT3n-EWFwNb6Zl1YRLOYOC_yZyj0Hyf0tViF3-2tSK-t-vdpww9zy5TfxsY6sXGvfmh_CEaorInSz1rGM34A; expires=Wed, 11-Nov-2020 16:07:30 GMT; path=/; domain=.google.com; HttpOnly'
إرسال الطلبات send requests
يلزمنا هنا فقط request لكن سوف نعدل قليلاً بها و نستخدم User-Agent هي المتصفحات التي ندخل بها أي متصفح بايثون لكن نحن نريد أن نستخدم متصفح موثوق مثل فايرفوكس سنستخدم User-Agent و نغيره.
>>> import urllib.request >>> request = urllib.request.Request("https://www.google.com/",headers={'User-Agent':'Mozilla/5.0'}) >>> request.header_items() [('User-agent', 'Mozilla/5.0')]
تحليل تشفير عناوين url عبر مكتبة urllib
تعني عمل encode للـ url لدينا و هذا معروف لكل شخص يعمل في مجال الويب أن url في المتصفح يحصل به نوع من أنواع encode بحيب المتصفح يستطيع قراءته. مثلاً نريد عمل بحث في المتصفح عن كلمة Muhammad Alush.
سوف نلاحظ أنه أعطانا البيانات كما يلي q=Muhammad+Alush نلاحظ وضع إشارة + بين الكلمتين و هذا يدل أن الرابط حلصت عليه عملية Encoding. و لعمل Encoding في بايثون للمثال السابق يكون كالتالي
>>> import urllib.request >>> import urllib.parse >>> data = {"q":"Muhammad Alush"} >>> en = urllib.parse.urlencode(data) >>> en 'q=Muhammad+Alush'
في البداية إستدعينا المكاتب و أنشأنا متغير و وضعنا له قيم البحث التي نريدها و بعدها عملنا encoding للأمر و طبع لنا كما أعطانا المتصفح في المثال الأول. و إذا نريد أن يظهر لدينا الشكل كرابط كامل من جوجل نستخدم الأوامر
>>> import urllib.request >>> import urllib.parse >>> data = {"q":"Muhammad Alush"} >>> en = urllib.parse.urlencode(data) >>> en 'q=Muhammad+Alush' >>> search = "https://www.google.com/search?"+en >>> search 'https://www.google.com/search?q=Muhammad+Alush'
لاحظتم كيف وضعنا رابط جوجل و إستدعينا الـ encoding من المثال السابق و وضع لنا نتيجة بحث كاملة مع رابط جوجل و بعدها إستدعينا الرابط.
قراءة جزء من هيدرز الموقع
>>> re = urllib.request.Request(search,headers={'User-Agent':'Mozilla/5.0'}) >>> ree = urllib.reqest.urlopen(re) >>> ree.read()[0:100] b'<!doctype html><html dir="rtl" itemscope=""itemtype="http://schema.prg/SearchResultsPage" lang="ar"'
دمج نتيجتين بحث بواسطة urljoin مع بعض
>>> import urllib.request >>> import urllib.parse >>> url = "/search/found" >>> url2 = "search/not" >>> urllib.parse.urljoin(url,url2) '/search/search/not'
أنشأنا نتيجة أولى و هي url و نتيجة ثانية و هي url2 ثم عن طريق urljoin قمنا بدمج النتيجتين مع بعضهما و عندما ضغطنا على زر Enter قام بدمج النتيجتين مع بعضهما.
رؤية تشفير encode url بواسطة مكتبة urllib
>>> urllib.parse.urlparse(search) ParseResult(scheme='https', netloc='www.google.com', path='/search', params='', query='q=Muhammad+Alush', fragment='')
رؤية معلومات url عن طريق qoute
>>> urllib.parse.quote("+Muhammad+Turkey+Alush") '%2BMuhammad%2BTurkey%2BAlush'
لاحظنا أنه وضع لنا %2B هذا نوع من انواع الروابط نراه دائماً في الروابط.
كيفية عمل بحث search مباشر بواسطة مكتبة urllib
>>> import requests >>> re = requests.get(search,headers={'User-Agent':'Mozilla/5.0'}) >>> re.content[0:100] b'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n<head><meta http-equiv="conte'
كل هذا كان اعتمادا على الذي استخدمناه من بداية الدرس من نفس الشل.
رؤية الهيدرز لنتيجة البحث بواسطة مكتبة urllib
>>> re.headers {'Date': 'Wed, 27 May 2020 12:02:43 GMT', 'Pragma': 'no-cache', 'Expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 'Cache-Control': 'no-store, no-cache, must-revalidate', 'Content-Type': 'text/html', 'Server': 'HTTP server (unknown)', 'Content-Length': '2868', 'X-XSS-Protection': '0', 'Alt-Svc': 'h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"'}
و لرؤية الكوكيز نكتب re.cookies و يظهر لنا.