از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استفاده از cURL در پایتون با PycURL
سرفصلهای مطلب
معرفی
در این آموزش قصد داریم روش استفاده را یاد بگیریم PycURL، که یک رابط برای کتابخانه cURL در پایتون است. حلقه ابزاری است که برای انتقال داده ها به و از سرور و برای انجام انواع درخواست های داده استفاده می شود. PycURL برای آزمایش API های REST، دانلود فایل ها و غیره عالی است روی. برخی از توسعه دهندگان استفاده از Postman را برای آزمایش API ها ترجیح می دهند، اما PycURL گزینه مناسب دیگری برای انجام این کار است زیرا از پروتکل های متعددی مانند FILE، FTPS، HTTPS، IMAP، POP3، SMTP، SCP، SMB و غیره پشتیبانی می کند. علاوه بر این، PycURL زمانی مفید است. اتصالات همزمان، سریع و قابل اعتماد مورد نیاز است.
همانطور که در بالا ذکر شد، PycURL یک رابط برای کتابخانه libcURL در پایتون است. بنابراین PycURL تمام قابلیت های libcURL را به ارث می برد. PycURL بسیار سریع است (شناخته شده است که بسیار سریعتر از Requests است که یک کتابخانه Python برای درخواست های HTTP است)، دارای پشتیبانی چند پروتکلی است و همچنین دارای سوکت هایی برای پشتیبانی از عملیات شبکه است.
پیش نیازها
قبل از اینکه این آموزش را ادامه دهید، لطفاً توجه داشته باشید که چند پیش نیاز وجود دارد. شما باید درک اولیه ای از نحو پایتون داشته باشید و/یا حداقل تجربه برنامه نویسی سطح مبتدی در زبان دیگری داشته باشید. علاوه بر این، شما باید درک خوبی از مفاهیم رایج شبکه مانند پروتکل ها و انواع آنها و حالت ارتباط مشتری-سرور داشته باشید. آشنایی با این مفاهیم برای درک کتابخانه PycURL ضروری است.
نصب و راه اندازی
نصب process برای PycURL برای همه سیستم عامل ها نسبتاً ساده و سرراست است. فقط باید libcURL را نصب کنید روی سیستم شما به منظور استفاده از PycURL.
سیستم عامل مک/لینوکس
برای سیستم عامل مک و لینوکس، نصب PycURL ساده ترین است زیرا هیچ وابستگی ندارد و libcURL به طور پیش فرض نصب می شود. به سادگی دستور زیر را در خود اجرا کنید terminal و نصب کامل خواهد شد:
نصب از طریق pip
$ pip install pycurl
نصب از طریق easy_install
$ easy_install pycurl
سیستم عامل ویندوز
با این حال، برای ویندوز، چند وابستگی وجود دارد که باید قبل از اینکه PyCURL در برنامههای شما استفاده شود، نصب شوند. اگر از توزیع رسمی پایتون استفاده می کنید (یعنی نسخه پایتون را از وب سایت رسمی دانلود کرده اید https://www.python.org) همچنین pip، کافی است دستور زیر را در خط فرمان خود اجرا کنید و نصب انجام می شود:
$ pip install pycurl
اگر استفاده نمی کنید pipنصب کننده های EXE و MSI در دسترس هستند ویندوز PycURL. شما می توانید آنها را مانند هر برنامه دیگری مستقیماً از آنجا دانلود و نصب کنید.
نمونه های کد پایه
در این بخش، ما قصد داریم چند نمونه کد نویسی PycURL را پوشش دهیم که عملکردهای مختلف رابط را نشان می دهد.
همانطور که در قسمت مقدمه ذکر شد، PycURL از پروتکل های زیادی پشتیبانی می کند و دارای ویژگی های پیچیده زیادی است. با این حال، در مثالهایمان، ما با پروتکل HTTP کار خواهیم کرد تا APIهای REST را با استفاده از متداولترین روشهای HTTP آزمایش کنیم: GET، POST، PUT و DELETE، همراه با چند مثال دیگر. ما نحوی را برای اعلان آنها در پایتون 3 می نویسیم و همچنین توضیح خواهیم داد که آنها چه کاری انجام می دهند.
پس بیایید شروع کنیم!
مثال 1: ارسال یک درخواست HTTP GET
یک عملیات شبکه ساده PycURL بازیابی اطلاعات از یک سرور معین با استفاده از URL آن است. همانطور که قبلاً استفاده می شود به این درخواست GET گفته می شود get
یک منبع شبکه
یک درخواست GET ساده را می توان با استفاده از PycURL با وارد کردن ماژول BytesIO و ایجاد شی آن انجام داد. یک شیء CURL برای انتقال داده ها و فایل ها بر روی URL ها ایجاد می شود.
URL مورد نظر با استفاده از setopt()
تابع، که به عنوان استفاده می شود setopt(option, value)
. این option
پارامتر مشخص می کند که کدام گزینه تنظیم شود، به عنوان مثال URL
، WRITEDATA
و غیره و value
پارامتر مقدار داده شده به آن گزینه خاص را مشخص می کند.
سپس داده های بازیابی شده از URL مجموعه به شکل بایت در شی BytesIO نوشته می شود. سپس بایت ها از شی BytesIO با استفاده از عبارت خوانده می شوند getvalue()
تابع هستند و متعاقباً رمزگشایی می شوند print HTML به console.
در اینجا مثالی از روش انجام این کار آورده شده است:
import pycurl
from io import BytesIO
b_obj = BytesIO()
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')
crl.setopt(crl.WRITEDATA, b_obj)
crl.perform()
crl.close()
get_body = b_obj.getvalue()
print('Output of GET request:\n%s' % get_body.decode('utf8'))
خروجی:
Output of GET request:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv = "Content-Type" content = "text/html; charset = utf-8">
<meta name="robots" content="index,nofollow">
<title>BeginnersGuide - Python Wiki</title>
<script type="text/javascript" src = "/wiki/common/js/common.js" ></script>
<script type = "text/javascript" >
<!--
var search_hint = "Search";
//-->
</script>
.
.
.
همچنین می توانید هدرهای پاسخ یک وب سایت را با کمک PycURL بازیابی کنید. سرصفحههای پاسخ را میتوان به دلایل مختلفی بررسی کرد، به عنوان مثال، برای اینکه بفهمیم چه رمزگذاری همراه با پاسخ ارسال شده است و آیا این کد مطابق با رمزگذاری ارائهشده توسط سرور است یا خیر.
در مثال خود، سرصفحههای پاسخ را به سادگی بررسی میکنیم تا نام ویژگیهای مختلف و مقادیر مربوط به آنها را بیابیم.
برای بررسی هدرهای پاسخ، ابتدا باید آنها را استخراج کنیم و این کار را با استفاده از عبارت انجام می دهیم HEADERFUNCTION
گزینه و نمایش آنها با استفاده از تابع خود تعریف شده (display_header()
در این مورد).
ما نشانی وب سایتی را ارائه می کنیم که سرصفحه های پاسخ آن را می خواهیم بررسی کنیم. HEADERFUNCTION
سرصفحه های پاسخ را به display_header()
عملکردی که در آن فرمت مناسبی دارند. سرصفحه های پاسخ بر اساس استاندارد مشخص شده رمزگشایی شده و به نام ها و مقادیر مربوطه تقسیم می شوند. فضاهای خالی بین نام ها و مقادیر حذف شده و سپس به حروف کوچک تبدیل می شوند.
سپس سرصفحه های پاسخ بر روی شی BytesIO نوشته می شوند، به درخواست کننده منتقل می شوند و در نهایت با فرمت مناسب نمایش داده می شوند.
from io import BytesIO
import pycurl
headers = {}
def display_header(header_line):
header_line = header_line.decode('iso-8859-1')
if ':' not in header_line:
return
h_name, h_value = header_line.split(':', 1)
h_name = h_name.strip()
h_value = h_value.strip()
h_name = h_name.lower()
headers(h_name) = h_value
def main():
print('**Using PycURL to get Twitter Headers**')
b_obj = BytesIO()
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://twitter.com')
crl.setopt(crl.HEADERFUNCTION, display_header)
crl.setopt(crl.WRITEDATA, b_obj)
crl.perform()
print('Header values:-')
print(headers)
print('-' * 20)
main()
خروجی:
**Using PycURL to get Twitter Headers**
Header values:-
{'cache-control': 'no-cache, no-store, must-revalidate, pre-check=0, post-check=0', 'content-length': '303055', 'content-type': 'text/html;charset=utf-8', 'date': 'Wed, 23 Oct 2019 13:54:11 GMT', 'expires': 'Tue, 31 Mar 1981 05:00:00 GMT', 'last-modified': 'Wed, 23 Oct 2019 13:54:11 GMT', 'pragma': 'no-cache', 'server': 'tsa_a', 'set-cookie': 'ct0=ec07cd52736f70d5f481369c1d762d56; Max-Age=21600; Expires=Wed, 23 Oct 2019 19:54:11 GMT; Path=/; Domain=.twitter.com; Secure', 'status': '200 OK', 'strict-transport-security': 'max-age=631138519', 'x-connection-hash': 'ae7a9e8961269f00e5bde67a209e515f', 'x-content-type-options': 'nosniff', 'x-frame-options': 'DENY', 'x-response-time': '26', 'x-transaction': '00fc9f4a008dc512', 'x-twitter-response-tags': 'BouncerCompliant', 'x-ua-compatible': 'IE=edge,chrome=1', 'x-xss-protection': '0'}
--------------------
در مواردی که چندین هدر با یک نام داشته باشیم، فقط آخرین مقدار هدر ذخیره می شود. برای ذخیره تمام مقادیر در هدرهای چند مقداری، می توانیم از کد زیر استفاده کنیم:
if h_name in headers:
if isinstance(headers(h_name), list):
headers(name).append(h_value)
else:
headers(h_name) = (headers(h_name), h_value)
else:
headers(h_name) = h_value
مثال 3: ارسال داده های فرم از طریق HTTP POST
درخواست POST درخواستی است که داده ها را با قرار دادن آن در بدنه درخواست HTTP به سرور وب ارسال می کند. وقتی فایلی را آپلود می کنید یا فرمی را ارسال می کنید، اساساً یک درخواست POST را به سرور تعیین شده ارسال می کنید.
یک درخواست POST را می توان با استفاده از PycURL انجام داد، ابتدا با تنظیم URL برای ارسال داده های فرم از طریق setopt
تابع. داده هایی که قرار است ارسال شوند ابتدا در قالب یک فرهنگ لغت (در جفت مقادیر کلیدی) ذخیره می شوند و سپس با استفاده از URL کدگذاری می شوند. urlencode
تابع موجود در urllib.parse
مدول.
ما استفاده می کنیم POSTFIELDS
گزینه ای در ارسال داده های فرم است زیرا به طور خودکار روش درخواست HTTP را روی POST تنظیم می کند و ما را مدیریت می کند pf
داده ها نیز
from urllib.parse import urlencode
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
data = {'field': 'value'}
pf = urlencode(data)
crl.setopt(crl.POSTFIELDS, pf)
crl.perform()
crl.close()
توجه داشته باشید: اگر می خواهید روش درخواست دیگری را مشخص کنید، می توانید از آن استفاده کنید CUSTOMREQUEST
گزینه ای برای انجام این کار فقط نام روش درخواست انتخابی خود را در کاماهای معکوس خالی زیر بنویسید crl.CUSTOMREQUEST
.
crl.setopt(crl.CUSTOMREQUEST, '')
مثال 4: آپلود فایل ها با چند قسمتی POST
چندین روش وجود دارد که می توانید روش بارگذاری یک فایل در فرم HTML را با استفاده از PycURL تکرار کنید:
- اگر داده هایی که باید از طریق درخواست POST ارسال شوند در یک فایل هستند روی سیستم شما، ابتدا باید URL را که می خواهید داده ها را در آن ارسال کنید، تنظیم کنید. سپس روش درخواست خود را به صورت مشخص می کنید
HTTPPOST
و استفاده کنیدfileupload
گزینه ای برای آپلود محتویات فایل مورد نظر.
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
crl.setopt(crl.HTTPPOST, (
('fileupload', (
crl.FORM_FILE, './my-resume.doc',
)),
))
crl.perform()
crl.close()
توجه داشته باشید: اگر می خواهید نام و/یا نوع محتوای فایل را تغییر دهید، می توانید با ایجاد تغییرات جزئی در کد بالا این کار را انجام دهید:
crl.setopt(crl.HTTPPOST, (
('fileupload', (
crl.FORM_FILE, './my-resume.doc',
crl.FORM_FILENAME, 'updated-resume.doc',
crl.FORM_CONTENTTYPE, 'application/msword',
)),
))
- برای داده های فایلی که در حافظه دارید، تنها چیزی که در اجرای درخواست POST متفاوت است، این است
FORM_BUFFER
وFORM_BUFFERPTR
در محلFORM_FILE
زیرا اینها داده هایی را که قرار است ارسال شوند، مستقیماً از حافظه دریافت می کنند.
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
crl.setopt(crl.HTTPPOST, (
('fileupload', (
crl.FORM_BUFFER, 'contact-info.txt',
crl.FORM_BUFFERPTR, 'You can reach me at (email protected)',
)),
))
crl.perform()
crl.close()
مثال 5: آپلود یک فایل با HTTP PUT
درخواست PUT از نظر ماهیت مشابه درخواست POST است، به جز این واقعیت که می توان از آن برای آپلود یک فایل در بدنه درخواست استفاده کرد. زمانی از درخواست PUT استفاده میکنید که URL شیئی را که میخواهید ایجاد یا بازنویسی کنید، بدانید. اساسا PUT هر چیزی را که در حال حاضر در URL هدف وجود دارد را با چیز دیگری جایگزین می کند.
اگر داده مورد نظر برای آپلود در یک فایل فیزیکی قرار دارد، ابتدا باید URL مورد نظر را تنظیم کنید، سپس فایل را آپلود کرده و آن را باز کنید. مهم است که فایل در زمانی که شی cURL از آن استفاده می کند باز نگه داشته شود. سپس داده ها با استفاده از فایل خوانده می شوند READDATA
.
در نهایت، انتقال فایل (آپلود) با استفاده از perform
تابع و سپس جلسه cURL به پایان می رسد. در نهایت، فایلی که در ابتدا برای شی CURL باز شده بود بسته می شود.
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
dat_file = open('data.txt')
crl.setopt(crl.UPLOAD, 1)
crl.setopt(crl.READDATA, dat_file)
crl.perform()
crl.close()
dat_file.close()
اگر دادههای فایل در یک بافر قرار داشته باشند، پیادهسازی PycURL تقریباً مشابه بارگذاری دادههای موجود در یک فایل فیزیکی است، با تغییرات جزئی. شی BytesIO داده ها را با استفاده از استاندارد مشخص شده رمزگذاری می کند. این بخاطر این است که READDATA
به یک شی شبیه IO نیاز دارد و داده های کدگذاری شده برای پایتون 3 ضروری است. آن داده های کدگذاری شده در یک بافر ذخیره می شود و سپس آن بافر خوانده می شود. بارگذاری داده ها انجام می شود و با تکمیل آپلود، جلسه cURL پایان می یابد.
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://www.code-learner.com/post/')
data = '{"person":{"name":"billy","email":"(email protected)"}}'
buffer = BytesIO(data.encode('utf-8'))
crl.setopt(crl.UPLOAD, 1)
crl.setopt(crl.READDATA, buffer)
crl.perform()
crl.close()
مثال 6: ارسال درخواست DELETE HTTP
یکی دیگر از روش های مهم و پرکاربرد HTTP DELETE است. روش DELETE درخواست می کند که سرور منبع شناسایی شده توسط URL هدف را حذف کند. می توان آن را با استفاده از CUSTOMREQUEST
تابع، همانطور که در نمونه کد زیر مشاهده می شود:
import pycurl
crl = pycurl.Curl()
crl.setopt(crl.URL, "http://api.example.com/user/148951")
crl.setopt(crl.CUSTOMREQUEST, "DELETE")
crl.perform()
crl.close()
مثال 7: نوشتن در یک فایل
PycURL همچنین می تواند برای ذخیره پاسخ به یک فایل استفاده شود. ما استفاده می کنیم open
تابع برای باز کردن فایل و پاسخ به عنوان یک شی فایل برگردانده می شود. این open
تابع به این شکل است: open(file, mode)
. این file
پارامتر نشان دهنده مسیر و نام فایلی است که باید باز شود و mode
نشان دهنده حالتی است که می خواهید فایل را در آن باز کنید. در مثال ما، مهم است که فایل در حالت باینری باز شود (به عنوان مثال wb
) به منظور جلوگیری از رمزگذاری و رمزگشایی پاسخ.
import pycurl
file = open('pycurl.md','wb')
crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://wiki.python.org/moin/BeginnersGuide')
crl.setopt(crl.WRITEDATA, file)
crl.perform()
crl.close()
نتیجه
در این آموزش با رابط PycURL در پایتون آشنا شدیم. ما با صحبت در مورد برخی از عملکردهای عمومی PycURL و ارتباط آن با کتابخانه libcURL در پایتون شروع کردیم. سپس نصب PycURL را دیدیم process برای سیستم عامل های مختلف
در نهایت، برخی از مثالهای عمومی PycURL را مرور کردیم که عملکردهای مختلف ارائه شده توسط PycURL، مانند روشهای HTTP GET، POST، PUT و DELETE را نشان میداد. پس از دنبال کردن این آموزش، باید بتوانید اشیاء شناسایی شده توسط یک URL در یک برنامه پایتون را به راحتی واکشی کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-19 13:40:04