آموزش پایتون - پردازش URL

در دنیای اینترنت، منابع مختلف با URLها (Uniform Resource Locators) شناسایی می‌شوند. کتابخانه استاندارد پایتون شامل پکیج urllib است که ماژول‌هایی برای کار با URLها دارد. این پکیج به شما کمک می‌کند URLها را تجزیه کنید، محتوای وب را دریافت نمایید و خطاها را مدیریت کنید.

این آموزش مفاهیم پایه urllib را معرفی می‌کند تا به شما در شروع استفاده از آن کمک کند. مهارت‌های خود را در وب اسکرپینگ، دریافت داده و مدیریت URLها با استفاده از urllib در پایتون ارتقا دهید.

پکیج urllib شامل ماژول‌های زیر برای پردازش URLها است −

  • ماژول urllib.parse برای تجزیه یک URL به اجزای تشکیل‌دهنده آن استفاده می‌شود.

  • ماژول urllib.request شامل توابعی برای باز کردن و خواندن URLها است.

  • ماژول urllib.error تعاریف استثناهای (exceptions) ایجادشده توسط urllib.request را در بر دارد.

  • ماژول urllib.robotparser فایل‌های robots.txt را تجزیه می‌کند.

ماژول urllib.parse

این ماژول به عنوان یک رابط استاندارد برای به‌دست آوردن بخش‌های مختلف از یک رشته URL عمل می‌کند. این ماژول شامل توابع زیر است −

urlparse(urlstring)

یک URL را به شش جزء تجزیه کرده و یک تاپل نام‌گذاری‌شده (named tuple) با ۶ آیتم برمی‌گرداند. هر آیتم تاپل یک رشته مربوط به ویژگی‌های زیر است −

ویژگی (Attribute) اندیس مقدار
scheme 0 مشخص‌کننده پروتکل URL
netloc 1 بخش آدرس شبکه (Network location)
path 2 مسیر سلسله‌مراتبی
params 3 پارامترهای آخرین عنصر مسیر
query 4 جزء پرس‌وجو (Query)
fragment 5 شناسه بخش (Fragment)
username نام کاربری
password رمز عبور
hostname نام میزبان (با حروف کوچک)
Port شماره پورت به صورت عدد صحیح، در صورت وجود

مثال

from urllib.parse import urlparse
url = "https://example.com/employees/name/?salary>=25000"
parsed_url = urlparse(url)
print (type(parsed_url))
print ("Scheme:",parsed_url.scheme)
print ("netloc:", parsed_url.netloc)
print ("path:", parsed_url.path)
print ("params:", parsed_url.params)
print ("Query string:", parsed_url.query)
print ("Frgment:", parsed_url.fragment)

این کد خروجی زیر را تولید خواهد کرد خروجی −

<class 'urllib.parse.ParseResult'>
Scheme: https
netloc: example.com
path: /employees/name/
params:
Query string: salary>=25000
Frgment:

parse_qs(qs)

این تابع یک رشته پرس‌وجو (query string) را که به عنوان آرگومان رشته‌ای داده شده است تجزیه می‌کند. داده‌ها به صورت یک دیکشنری بازگردانده می‌شوند. کلیدهای دیکشنری، نام‌های منحصر‌به‌فرد متغیرهای پرس‌وجو و مقادیر آن‌ها لیستی از مقادیر برای هر نام هستند.

برای استخراج بیشتر پارامترهای پرس‌وجو از رشته پرس‌وجو به داخل یک دیکشنری، می‌توانید از تابع parse_qs() روی ویژگی query شیء ParseResult به صورت زیر استفاده کنید −

مثال

from urllib.parse import urlparse, parse_qs
url = "https://example.com/employees?name=Anand&salary=25000"
parsed_url = urlparse(url)
dct = parse_qs(parsed_url.query)
print ("Query parameters:", dct)

این کد خروجی زیر را تولید خواهد کرد خروجی −

Query parameters: {'name': ['Anand'], 'salary': ['25000']}

urlsplit(urlstring)

این تابع مشابه urlparse() است، اما params را از URL جدا نمی‌کند. اگر سنتکس‌های جدیدتر URL مد نظر باشد که اجازه می‌دهند پارامترها به هر بخش از مسیر URL اعمال شوند، عموماً باید به جای urlparse() از این تابع استفاده شود.

urlunparse(parts)

این تابع معکوس تابع urlparse() است. این تابع یک URL را از یک تاپل (مشابه آنچه توسط urlparse() بازگردانده می‌شود) بازسازی می‌کند. آرگومان parts می‌تواند هر شیء قابل پیمایش (iterable) با شش آیتم باشد. این تابع یک URL معادل را برمی‌گرداند.

مثال

from urllib.parse import urlunparse

lst = ['https', 'example.com', '/employees/name/', '', 'salary>=25000', '']
new_url = urlunparse(lst)
print ("URL:", new_url)

این کد خروجی زیر را تولید خواهد کرد خروجی −

URL: https://example.com/employees/name/?salary>=25000

urlunsplit(parts)

عناصر یک تاپل بازگردانده‌شده توسط urlsplit() را به صورت یک URL کامل در قالب یک رشته ترکیب می‌کند. آرگومان parts می‌تواند هر شیء قابل پیمایش با پنج آیتم باشد.

ماژول urllib.request

این ماژول توابع و کلاس‌هایی را برای مدیریت عملیات باز کردن و خواندن URLها با استفاده از تابع urlopen() ارائه می‌دهد.

تابع urlopen()

این تابع URL داده‌شده را که می‌تواند یک رشته یا یک شیء Request باشد، باز می‌کند. پارامتر اختیاری timeout مدت زمان مهلت (به ثانیه) را برای عملیات‌های بلاک‌کننده مشخص می‌کند. این تابع در واقع فقط برای اتصالات HTTP، HTTPS و FTP کار می‌کند.

این تابع همیشه شیئی را برمی‌گرداند که می‌تواند به عنوان یک context manager عمل کند و دارای ویژگی‌های url، headers و status است. برای URLهای HTTP و HTTPS، این تابع یک شیء http.client.HTTPResponse اندکی تغییریافته را برمی‌گرداند.

مثال

کد زیر از تابع urlopen() برای خواندن داده‌های باینری یک فایل تصویری استفاده کرده و آن را در یک فایل محلی می‌نویسد. می‌توانید فایل تصویری را روی کامپیوتر خود با استفاده از هر نمایش‌دهنده تصاویری باز کنید.

from urllib.request import urlopen
obj = urlopen("https://www.tutorialspoint.com/images/logo.png")
data = obj.read()
img = open("img.jpg", "wb")
img.write(data)
img.close()

این کد خروجی زیر را تولید خواهد کرد خروجی −

urllib_request

شیء Request

ماژول urllib.request شامل کلاس Request است. این کلاس انتزاعی از یک درخواست URL است. سازنده (constructor) این کلاس به یک آرگومان رشته‌ای اجباری که یک URL معتبر است نیاز دارد.

سنتکس

urllib.request.Request(url, data, headers, origin_req_host, method=None)

پارامترها

  • url − یک رشته که یک URL معتبر است.

  • data − شیئی که داده‌های اضافی برای ارسال به سرور را مشخص می‌کند. این پارامتر فقط با درخواست‌های HTTP قابل استفاده است. داده‌ها می‌توانند بایت‌ها، اشیای شبیه فایل و اشیای قابل پیمایش از بایت‌ها باشند.

  • headers − باید دیکشنری از هدرها و مقادیر مربوط به آن‌ها باشد.

  • origin_req_host − باید میزبان درخواست‌کننده (request-host) تراکنش اصلی باشد.

  • method − باید رشته‌ای باشد که متد درخواست HTTP را نشان می‌دهد. یکی از متدهای GET، POST، PUT، DELETE و سایر افعال HTTP. مقدار پیش‌فرض GET است.

مثال

from urllib.request import Request
obj = Request("https://www.tutorialspoint.com/")

اکنون می‌توان از این شیء Request به عنوان آرگومان برای متد urlopen() استفاده کرد.

from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)

تابع urlopen() یک شیء HttpResponse برمی‌گرداند. فراخوانی متد read() آن، منبع موجود در URL داده‌شده را دریافت می‌کند.

from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)
data = resp.read()
print (data)

ارسال داده

اگر آرگومان data را در سازنده Request تعریف کنید، یک درخواست POST به سرور ارسال خواهد شد. داده‌ها باید هر شیئی باشند که به صورت بایت نمایش داده می‌شوند.

from urllib.request import Request, urlopen
from urllib.parse import urlencode

values = {'name': 'Madhu',
   'location': 'India',
   'language': 'Hindi' }
data = urlencode(values).encode('utf-8')
obj = Request("https://example.com", data)

ارسال هدرها

سازنده Request همچنین آرگومان headers را می‌پذیرد تا اطلاعات هدر را وارد درخواست کند. این آرگومان باید در قالب یک شیء دیکشنری باشد.

headers = {'User-Agent': user_agent}
obj = Request("https://example.com", data, headers)

ماژول urllib.error

استثناهای زیر در ماژول urllib.error تعریف شده‌اند −

URLError

URLError به این دلیل رخ می‌دهد که هیچ اتصال شبکه‌ای وجود ندارد (مسیری به سرور مشخص‌شده وجود ندارد) یا سرور مشخص‌شده وجود ندارد. در این حالت، استثنای رخ‌داده دارای ویژگی 'reason' خواهد بود.

مثال

from urllib.request import Request, urlopen
import urllib.error as err

obj = Request("http://www.nosuchserver.com")
try:
   urlopen(obj)
except err.URLError as e:
   print(e)

این کد خروجی زیر را تولید خواهد کرد خروجی −

HTTP Error 403: Forbidden

HTTPError

هر بار که سرور یک پاسخ HTTP ارسال می‌کند، این پاسخ با یک "کد وضعیت" عددی همراه است. این کد نشان می‌دهد که چرا سرور قادر به پاسخگویی به درخواست نیست. پردازنده‌های پیش‌فرض برخی از این پاسخ‌ها را برای شما مدیریت می‌کنند. برای مواردی که امکان مدیریت آن‌ها وجود ندارد، تابع urlopen() یک HTTPError ایجاد می‌کند. نمونه‌های بارز HTTPError عبارتند از '404' (صفحه پیدا نشد)، '403' (درخواست ممنوع است) و '401' (نیاز به احراز هویت است).

مثال

from urllib.request import Request, urlopen
import urllib.error as err

obj = Request("http://www.python.org/fish.html")
try:
   urlopen(obj)
except err.HTTPError as e:
   print(e.code)

این کد خروجی زیر را تولید خواهد کرد خروجی −

404

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.