کتابخانه Requests در پایتون (قسمت اول)

کتابخانه Requests در پایتون (قسمت اول)

کتابخانه Requests

کتابخانه Requests جزو محبوب ترین کتابخانه های پایتون است. کاربرد اصلی این کتابخانه کار از طریق آن با API های Restful در اینترنت ارتباط برقرار سازد. به عبارت ساده تر به شما این امکان را می دهد تا از طریق پروتکل HTTP/1.1 درخواست مورد نظر خود را فرستاده و جواب آن را دریافت نمائید. اجازه دهید وقت را تلف نکنیم و به روش های استفاده از این کتابخانه بپردازیم.

در صورتی که با مفهوم کتابخانه ها اطلاع کافی ندارید اینجــــــــــــــا را کلیک کنید.

نصب کتابخانه Requests:

نصب کتابخانه Requests بسیار ساده است. کافی است دستور زیر را در خط فرمان یا همان Command Prompt خود وارد نمائید:

> pip install requests

اگر از ترمینال لینوکس استفاده می کنید از دستور زیر استفاده نمائید:

$ pipenv install requests

نکته: اگر علاقه به دریافت کد کتابخانه Requests هستید می توانید با مراجعه به Git آن را دریافت نمائید. این کتابخانه کاملا Open-Source است.

$ git clone git://github.com/requests/requests.git

خوب تبریک میگم. تا به اینجا موفق به نصب این کتابخانه شده اید. در ادامه به روش استفاده از این کتابخانه خواهیم پرداخت.

ایجاد یک درخواست — Make a Request:

کار کردن با کتابخانه Requests بسیار ساده است. اجازه دهید به عنوان اولین قدم با Import کردن آن شروع کنیم:

>>> import requests

خوب اجازه بدهید برای مثال یک آدرس وب را بگیریم. در این مثال از Git Time Line استفاده کردیم:

>>> r = requests.get('https://api.github.com/events')

با اجرای این دستور ساده Object ی به نام r ایجاد کردیم که از نوع Response است. با استفاده از آن می توانیم به تمام اطلاعات فراخوانی شده دست پیدا کنیم.

با استفاده از کتابخانه Requests می توانیم به سادگی از متد Post نیز استفاده کنیم. لطفا به مثال زیر توجه کنید:

>>> r = requests.post('https://httpbin.org/post', data = {'key':'value'})

همانطور که میبینید بسیار ساده و آسان می توانید از این کتابخانه استفاده کنید. سوالی که پیش می آید این است که در خصوص سایر متدهای موجود در HTTP روش استفاده چگونه است مثلا در خصوص PUT, DELETE, HEAD و OPTIONS؟ به مثالهای زیر توجه کنید:

>>> r = requests.put('https://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('https://httpbin.org/delete')
>>> r = requests.head('https://httpbin.org/get')
>>> r = requests.options('https://httpbin.org/get')

با توجه به مثال های فوق شما روش استفاده اولیه از کتابخانه Requests را دیدید. اینها قابلیت هایی است که این کتابخانه محبوب در اختیارتان می گذارد.

ارسال پارامتر به یک آدرس — Passing Parameters In URLs

در بسیاری از موارد شما می خواهید پارامترهایی به به URL مورد نظر به عنوان پارامترهای Query خود ارسال کنید. زمانی که به صورت دستی رشته خود را می سازید اطلاعات به صورت key/value بعد از علامت سوال قرار می گیرند. به طور مثال:

httpbin.org/get?key=val

کتابخانه Requests این امکان را فراهم کرده است که پارامترها را به شکل دیکشنری از نوع رشته یا همان string تعریف کرده و با استفاده از کلمه params آنها را به URL خود بفرستید:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('https://httpbin.org/get', params=payload)

برای کنترل آن که ببینید دستور درست ساخته شده است می توانید از دستور print استفاده کنید:

>>> print(r.url)
        https://httpbin.org/get?key2=value2&key1=value1

نکته قابل تواجه آن است که در صورتی که value برای یک key در دیکشنری خالی باشد در رشته قرار نگرفته و در نتیجه به URL ارسال نخواهد شد.

شما همچنین شما می توانید لیستی از آیتم ها را به عنوان value ارسال کنید:

>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}

>>> r = requests.get('https://httpbin.org/get', params=payload)
>>> print(r.url)
        https://httpbin.org/get?key1=value1&key2=value2&key2=value3

محتوای پاسخ — Response Content

با توجه به پاسخ سرور شما می توانید محتوای ارسالی را بخوانید. با توجه به مثال Time Line سایت Git خروجی به صورت زیر خواهد بود:

>>> import requests

>>> r = requests.get('https://api.github.com/events')
>>> r.text
         u'[{“repository”:{“open_issues”:0,”url”:”https://github.com/…

در کتابخانه Requests محتوای دریافت شده از سرور به طور خودکار رمزگشایی می گردد. اغلب Unicode charsets بصورت یکپارچه رمزگشایی می شوند.

هنگام ارسال درخواست، Requests می تواند کد گذاری پاسخ را با توجه به HTTP Header حدس می زند. زمانی که کی خواهید از r.text استفاده کنید رمزگذاری متن توسط Requests خوانده و حدس زده می شود. شما می توانید بفهمید که کتابخانه Requests از چه کدگذاری استفاده کرده و همچنین  با استفاده از از ویژگی r.encoding در صورت نیاز آن را تغییر دهید:

>>> r.encoding
         ‘utf-8’
>>> r.encoding = 'ISO-8859-1'

درصورتی که شما رمزگذاری یا همان encoding را تغییر دهید، Requests مقدار جدید r.encoding را هر وقت که r.text را مجددا فراخوانی کنید استفاده خواهد کرد. احتمال دارد شما تغییر کدگذاری را در هر شرایطی انجام دهید که در این صورت میتوانید منطق خاصی را برای کدگذاری محتوا استفاده کنید. به عنوان مثال، HTML و XML توانایی تعیین رمزگذاری را در بدنه خود دارند. در چنین شرایطی، شما باید از r.content برای پیدا کردن کدگذاری استفاده کنید و سپس r.encoding را تنظیم کنید. که در این صورت r.text را با رمزگذاری صحیح خوانده می شود.

همچنین Requests در صورت نیاز امکان استفاده از رمزگذاری های سفارشی را فراهم می کند. اگر شما رمزگذاری خود را ایجاد کرده اید و آن را با ماژول کدک ها ثبت کرده اید، می توانید به سادگی از نام کدک به عنوان مقدار r.encoding استفاده کرده و Requests رمزگشایی را برای شما انجام خواهد داد.

محتوای پاسخ دودویی — Binary Response Content

شما در کتابخانه Requests امکان دریافت محتوی خود در قالب بایت را برای درخواست هایی که text نیستند را دارید.

>>> r.content
        b'[{“repository”:{“open_issues”:0,”url”:”https://github.com/…

رمزگذاری انتقال و رمزگذاری gzip و deflate به صورت خودکار برای شما رمزگشایی می شود.

برای مثال، برای ایجاد یک تصویر از داده های باینری که توسط یک درخواست خوانده شده است، می توانید از کد زیر استفاده کنید:

>>> from PIL import Image
>>> from io import BytesIO

>>> i = Image.open(BytesIO(r.content))

محتوی پاسخ JSON یا JSON Response Content

در صورتی که با داده های JSON سر و کار دارید، یک رمزگشای JSON در کتابخانه Requests وجود دارد:

>>> import requests

>>> r = requests.get('https://api.github.com/events')
>>> r.json()
         [{u’repository’: {u’open_issues’: 0, u’url’: ‘https://github.com/…

در صورتی که رمزگشایی JSON با مشکل مواجه شود، دستور r.JSON خطا بازمیگرداند. به طور مثال در هنگام فراخوانی r.JSON پاسخ ۲۰۴ (No Content) و یا پاسخ  invalid JSON دریافت کند، خطای زیر raise خواهد شد:

         ValueError: No JSON object could be decoded.

توجه به این نکته مهم است که فراخوانی موفق r.JSON به معنی موفقیت در دریافت پاسخ نیست. بعضی از سرورها پاسخ خطا را در قابل JSON باز می گردانند. به طور مثال جزئیات خطای HTTP 500. چنین JSONهایی رمزگشایی شده و بازخواهند کشت. برای بررسی موفقیت درخواست، می بایست از r.raise_for_status یا r.status_code را استفاده کنید و بررسی کندی که آیا پاسخ چیزی است که شما انتظار دارید یا خیر.

محتوی پاسخ خام — Raw Response Content

در مواردی خاص که می خواهید پاسخی خام لز سرور دریافت کنید می توانید از r.raw استفاده کنید. در صورت که می خواهید از این متد استفاده کنید، توجه نمایید که در هنگام initial کردن درخواست مقدار stream=True را حتما استفاده کرده باشید:

>>> r = requests.get('https://api.github.com/events', stream=True)

>>> r.raw
      

>>> r.raw.read(10)
       ‘x1fx8bx08x00x00x00x00x00x00x03’

به طور کلی از ساختارهایی مانند زیر می توان برای ذخیره اطلاعات در حال stream مورد استفاده قرار می گیرد.

with open(filename, 'wb') as fd:
          for chunk in r.iter_content(chunk_size=128):
                    fd.write(chunk)

با استفاده از Response.iter_content، مقدار زیادی از آنچه شما می بایست در صورت استفاده از Response.raw رسیدگی کنید را کاهش می دهد. هنگام streaming کردن دانلود در بالا، توصیه شده برای بازیابی محتوا از این متد استفاده شود. توجه داشته باشید که chunk_size را می توان آزادانه با توجه به ظرفیت buffer خود تنظیم کنید.

نکته:

توجه مهم در مورد استفاده از Response.iter_content در مقابل Response.raw:

Response.iter_content به طور خودکار gzip را رمزگشایی کرده و رمزگذاری انتقال را حذف می کند. Response.raw یک جریان خام بایت است و در نتیجه محتوای پاسخ را تبدیل نمی کند. اگر شما واقعا نیاز به دسترسی به بایت ها را داشته باشید، می بابست از Response.raw استفاده کنید.

8 دیدگاه در “کتابخانه Requests در پایتون (قسمت اول)

  • سلام. وقت بخیر.من میخوام یه url رو بخونه و در صورتی که اون url در دسترس هست، یعنی خطای سرور نمیده، اون رو دانلود کنه و در آدرسی در هارد ذخیره اش کنه. چه دستوری باید بنویسم؟

    • سلام. وقت شما هم به خیر. منظورتون این هست که محتوای موجود در url رو در یک مسیر local ذخیره کنه؟
      نمونه ای از url که می خواید باهاش کار کنید رو دارید؟

  • سلم خسته نباشید من جدیدا امدم سراغ پایتون میروم بدونم روشی یا منبع فارسی هست که کتابخونه های پایتون رو اموز بده یا حتی ماژور های یک کتاب خونه رو بگه چیا هستن

  • سلم خسته نباشید من جدیدا امدم سراغ پایتون میخوام بدونم روشی یا منبع فارسی هست که کتابخونه های پایتون رو اموزش بده یا حتی ماژول
    های یک کتاب خونه رو بگه چیا هستن

    • سلام. امیدوازم موفق باشید. خیر برای اکثر کتابخانه های راهنمای فارسی وجود نداره و می بایست از مراجه انگلیسی استفاده کنید.

  • سلام، وقتتون بخیر.
    من برای یک پژوهش میخوام زمان سفر بین چندین نقطه جغرافیایی رو داشته باشم و ذخیره کنم.
    متاسفانه api گوگل مپس پولی شده، برای همین گشتم یه سایت ایرانی پیدا کردم که امکانات مشابه در اختیار بده. نمیدونم سوالم رو جای درستی پرسیدم یا نه، اما فکر میکنم از دستور request باید استفاده کنم.
    nav_request = ‘origins={}&destinations={}’.format(origins,destinations)
    request = url_api + nav_request
    response = request.urlopen(request).read()
    همچین چیزی نوشته بودم، اما خب به وضوح کلید api رو نذاشتم و نمیدونم کجا هم باید بذارمش… نمیدونم کلا هم چقدر درسته!
    خیلی خیلی ممنون میشم اگر راهنمایی کنید.
    چیزی که تو سایت نوشته به این صورت هست
    GET:
    https://api.neshan.org/v1/distance-matrix?origins=36.3177579,59.5323219|36.337115,59.530621&destinations=36.35067,59.5451965|36.337005,59.530021
    Headers:
    Api-Key: YOUR_API_KEY

  • سلام من میخواستم یه روبات وب گرد درست کنم
    اول از کتاب خونه ی selenium استفاده ولی از اونجایی که خیلی سنگین بود و اینترنت هم زیاد مصرف میکرد تصمیم گرفتم از یه کتاب خونه دیگه استفاده کنم آیه کتاب خونه request به درد این کار میخوره و باهاش میشه روبات های وب گرد درست کرد

    • سلام و ممنونم از توجهتون. راستش بله تا حدی می تونید از این کتابخانه استفاده کنید شما هر آدرسی رو بدین می تونید محتواش رو دریافت کنید از این بابت مشکلی نداره

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *