FA-TOOLS — Header Component

آموزش requests در پایتون — GET، POST، Headers

رفیق برنامه‌نویس! اگه دنبال یک راه حل توپ برای ارتباط با دنیای وب تو پایتون می‌گردی، درست اومدی! پکیج requests مثل یک جادوگر کاربلد، همه ارتباطات HTTP رو برات راحت می‌کنه. از درخواست‌های ساده GET گرفته تا ارسال داده‌های پیچیده POST و مدیریت Headers، هرچی که فکرشو بکنی اینجا هست. می‌خوای حرفه‌ای‌تر بشی و پروژه‌های پایتونت رو یه سر و گردن بالاتر ببری؟ پس همین الان سری به ابزارهای پایتونی ما بزن و قدرت کدنویسیتو چند برابر کن!

برای مشاوره فوری و پشتیبانی: 09202232789

🗺️ نقشه راه سریع: requests در یک نگاه! 🚀

آموزش requests در پایتون — GET، POST، Headers — تصویر 1
مفهوم اصلی 🌟 چی باید بدونی؟ 💡
requests چیه؟ کتابخونه پایتون برای کار با HTTP (خیلی ساده‌تر و کاربردی‌تر از urllib).
نصب 🛠️ pip install requests – توی ترمینال بزن و تمومه!
GET 📥 (دریافت) برای گرفتن اطلاعات از سرور (مثلاً API). پارامترها تو URL میرن. متد requests.get().
POST 📤 (ارسال) برای فرستادن اطلاعات جدید به سرور (مثلاً ثبت‌نام، آپلود فایل). داده‌ها تو بدنه درخواست میرن. متد requests.post().
Headers 🏷️ اطلاعات اضافه درباره درخواست یا پاسخ (مثلاً نوع محتوا، توکن احراز هویت). دیکشنری headers تو متدها.
پاسخ (Response) ✅ یک شیء شامل نتیجه درخواستت: .status_code (کد وضعیت), .text (متن), .json() (داده JSON).
مدیریت خطا 🚨 با response.raise_for_status() خطاها رو خودکار بررسی کن و از try-except استفاده کن.
ویژگی‌های پیشرفته ⚙️ تایم‌اوت، احراز هویت (Basic Auth)، سشن‌ها (برای حفظ کوکی), پراکسی‌ها (برای امنیت و عبور از محدودیت).

این خلاصه‌ی کل مقاله است، برای جزئیات کامل و مثال‌های عملی، ادامه مطلب رو با دقت بخون!

فهرست مطالب

آموزش requests در پایتون — GET، POST، Headers — تصویر 2

requests چیست و چرا انقدر محبوب است؟

آموزش requests در پایتون — GET، POST، Headers — تصویر 3

اگه تو دنیای برنامه‌نویسی پایتون هستی و نیاز داری با وب ارتباط برقرار کنی، مثلاً اطلاعاتی رو از یه سایت بگیری (مثل قیمت سهام یا اخبار) یا داده‌ای رو بهش بفرستی (مثل فرم‌های ثبت‌نام)، کتابخونه requests مثل یه رفیق شفیق میاد سراغت. این کتابخونه خیلی کار رو آسون کرده و برای همین هم هست که به عنوان استاندارد واقعی برای HTTP تو پایتون شناخته میشه. قبلاً ممکنه با urllib سر و کله زده باشی که خب یه کم پیچیده و دردسر ساز بود، ولی requests اومده تا زندگی رو برات شیرین‌تر کنه.

در واقع، requests یه لایه سطح بالا روی ماژول‌های داخلی پایتون برای کار با وب هست. این یعنی چی؟ یعنی به جای اینکه درگیر جزئیات پایین‌رده پروتکل HTTP بشی، با چند خط کد ساده می‌تونی درخواست (Request) بفرستی و پاسخ (Response) رو دریافت کنی. از جمله کارهایی که requests برات می‌کنه میشه به مدیریت اتوماتیک کوکی‌ها، فشرده‌سازی، احراز هویت و ریدایرکت‌ها اشاره کرد. اینا تغییرات اساسي تو نحوه کار با وب ایجاد می‌کنه و کلی دردسر رو از دوشت برمی‌داره!

نصب و آماده‌سازی: شروع کار با requests

قبل از هرکاری، باید requests رو نصب کنی. این کار هم مثل نصب بیشتر پکیج‌های پایتون، با pip خیلی ساده انجام میشه. ترمینال یا Command Prompt رو باز کن و این دستور رو بزن:

pip install requests

بعد از نصب موفقیت‌آمیز، حالا آماده‌ای که توی کد پایتونت ازش استفاده کنی. برای این کار فقط کافیه اول فایل پایتونت، پکیج رو import کنی:

import requests

درخواست‌های GET: دریافت اطلاعات از وب

خب، رسیدیم به پرکاربردترین نوع درخواست، یعنی GET. وقتی می‌خوای از یه سرور اطلاعاتی رو بخونی یا دریافت کنی، از GET استفاده می‌کنی. مثلاً دیدن یه صفحه وب، دریافت اطلاعات یه کاربر از API یا دانلود یه فایل.

اولین درخواست GET

فرض کن می‌خوایم از یه آدرس ساده اطلاعاتی بگیریم. مثلاً وضعیت یه API.


import requests

url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)

print(f"کد وضعیت: {response.status_code}")
print(f"نوع محتوا: {response.headers['Content-Type']}")
print("متن پاسخ:")
print(response.text)
# یا اگر پاسخ JSON بود:
# print(response.json())
    

اینجا requests.get() یه شی Response بهت برمی‌گردونه که کلی اطلاعات باحال توش هست. response.status_code کد وضعیت HTTP رو نشون میده (مثل 200 برای موفقیت، 404 برای پیدا نشدن). response.text هم محتوای پاسخ رو به صورت رشته بهت میده. اگه سرور اطلاعات رو با فرمت JSON فرستاده باشه، response.json() خیلی تمیز اونو تبدیل به دیکشنری پایتون می‌کنه.

ارسال پارامترها با GET

معمولاً برای فیلتر کردن یا جستجو، نیاز داریم پارامترهایی رو با درخواست GET بفرستیم. مثلاً تو URL اینجوری دیده میشن: ?key1=value1&key2=value2.

requests این کارو برات خیلی ساده کرده:


import requests

url = "https://jsonplaceholder.typicode.com/comments"
params = {
    "postId": 1,
    "id": 5 
}
response = requests.get(url, params=params)

print(f"درخواست به URL: {response.url}") # URL نهایی با پارامترها
print("پاسخ JSON:")
print(response.json())
    

همونطور که می‌بینی، requests خودش پارامترهای تو دیکشنری params رو به URL اضافه می‌کنه. نیاز نیست خودت رشته query string رو بسازی، که خب این عالیه!

درخواست‌های POST: ارسال داده به سرور

برعکس GET که برای دریافت اطلاعات بود، POST برای ارسال داده به سرور استفاده میشه. مثلاً موقع ثبت‌نام تو یه سایت، آپلود یه فایل یا ارسال فرم‌های دیگه. داده‌ها تو بدنه (Body) درخواست فرستاده میشن، نه تو URL.

ارسال داده فرم (Form Data)

برای ارسال داده به صورت فرم، کافیه یه دیکشنری بسازی و اون رو به پارامتر data تو تابع requests.post() بدی:


import requests

url = "https://jsonplaceholder.typicode.com/posts"
payload = {
    "title": "یک عنوان جدید",
    "body": "این متن بدنه پست جدید است.",
    "userId": 1
}
response = requests.post(url, data=payload)

print(f"کد وضعیت: {response.status_code}")
print("پاسخ سرور:")
print(response.json()) # معمولا سرور شی ساخته شده رو برمی‌گردونه
    

requests خودش Content-Type رو به application/x-www-form-urlencoded تنظیم می‌کنه.

ارسال JSON (داده به عنوان JSON)

خیلی از APIها انتظار دارن که داده‌ها رو به صورت JSON براشون بفرستی. تو این حالت، به جای data، از پارامتر json استفاده کن:


import requests
import json

url = "https://jsonplaceholder.typicode.com/posts"
payload_json = {
    "title": "عنوان با JSON",
    "body": "بدنه با فرمت JSON",
    "userId": 1
}
response = requests.post(url, json=payload_json)

print(f"کد وضعیت: {response.status_code}")
print("پاسخ سرور:")
print(response.json())
    

با استفاده از json=payload_json، requests خودش دیکشنری رو به رشته JSON تبدیل می‌کنه و Content-Type رو هم به application/json تنظیم می‌کنه. چقدر خوب، نه؟

آپلود فایل

اگه نیاز به آپلود فایل داری، requests با پارامتر files این کار رو برات ساده می‌کنه. باید یه دیکشنری بسازی که کلیدش اسم فیلد فایل و مقدارش تاپل (filename, file_object, content_type) باشه.


import requests

# ساخت یک فایل تستی
with open("test_file.txt", "w") as f:
    f.write("این یک فایل تستی برای آپلود است.")

url = "https://httpbin.org/post" # یک سرویس برای تست درخواست‌های HTTP
files = {'upload_file': open('test_file.txt', 'rb')} # 'rb' یعنی باز کردن در حالت باینری برای خواندن

try:
    response = requests.post(url, files=files)
    print(f"کد وضعیت: {response.status_code}")
    print("پاسخ سرور:")
    print(response.json())
finally:
    # حتما فایل رو ببندیم
    files['upload_file'].close()
    # یا میشه با "with" باز کرد که خودش ببنده
    # with open('test_file.txt', 'rb') as f:
    #    files = {'upload_file': f}
    #    response = requests.post(url, files=files)
    #    print(response.json())
    

httpbin.org یک سرویس عالی برای تست انواع درخواست‌های HTTP هست. حتماً ازش استفاده کن.

کار با Headers: شناسنامه درخواست‌ها

هدرها (Headers) مثل شناسنامه درخواست و پاسخ می‌مونن. اطلاعاتی مثل نوع محتوا (Content-Type)، طول محتوا (Content-Length)، نوع مرورگر (User-Agent)، کوکی‌ها و توکن‌های احراز هویت تو هدرها قرار می‌گیرن. گاهی لازمه هدرهای خاصی رو برای درخواستت تنظیم کنی، مثلاً برای احراز هویت یا برای اینکه سرور فکر کنه داری از یه مرورگر خاصی استفاده می‌کنی.

تنظیم Headers سفارشی

برای تنظیم هدرهای سفارشی، کافیه یه دیکشنری از هدرهات بسازی و اون رو به پارامتر headers بدی:


import requests

url = "https://httpbin.org/headers"
custom_headers = {
    "User-Agent": "MyPythonApp/1.0",
    "Accept-Language": "fa-IR,en-US;q=0.9,en;q=0.8",
    "X-Custom-Header": "MyValue" 
}
response = requests.get(url, headers=custom_headers)

print(f"کد وضعیت: {response.status_code}")
print("هدرهای ارسالی:")
print(response.json()['headers'])
    

همونطور که تو خروجی httpbin.org/headers می‌بینی، هدرهای سفارشی ما با موفقیت ارسال شدن.

بررسی Headers پاسخ

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


import requests

url = "https://www.google.com"
response = requests.get(url)

print("هدرهای پاسخ:")
for key, value in response.headers.items():
    print(f"{key}: {value}")

print(f"nنوع محتوا از هدر: {response.headers.get('Content-Type')}")
    

مدیریت پاسخ‌ها و کدهای وضعیت HTTP

هر درخواستی که به سرور می‌فرستی، یه پاسخی (Response) داره. این پاسخ شامل اطلاعات مهمی مثل کد وضعیت (Status Code)، هدرها و محتوای اصلیه. فهمیدن اینا خیلی مهمه.

کدهای وضعیت HTTP

کد وضعیت یه عدد سه‌رقمیه که نتیجه درخواستت رو نشون میده. چند تا از مهم‌ترین‌هاشون اینان:

  • 200 OK: درخواست با موفقیت انجام شد.
  • 201 Created: درخواست با موفقیت انجام شد و یک منبع جدید ایجاد شد (معمولاً برای POST).
  • 301 Moved Permanently: منبع به صورت دائم منتقل شده.
  • 400 Bad Request: درخواست ارسالی مشکل داره (مثلاً پارامتر اشتباه).
  • 401 Unauthorized: احراز هویت لازم است.
  • 403 Forbidden: اجازه دسترسی به این منبع رو نداری.
  • 404 Not Found: منبع درخواستی پیدا نشد.
  • 500 Internal Server Error: خطایی تو سرور رخ داده.

بررسی خطاها با raise_for_status()

برای اینکه کد وضعیت رو دستی چک نکنی (مثلاً if response.status_code != 200:requests یه متد باحال داره به اسم raise_for_status(). اگه کد وضعیت یه کد خطای 4xx یا 5xx باشه، یه استثنا (Exception) بهت میده، در غیر این صورت هیچ کاری نمی‌کنه. این کارو خیلی تمیزتر می‌کنه:


import requests

try:
    # این آدرس 404 برمی‌گردونه
    response = requests.get("https://jsonplaceholder.typicode.com/nonexistent")
    response.raise_for_status() # اگه خطا باشه، اینجا Exception میندازه
    print("درخواست موفقیت‌آمیز بود.")
except requests.exceptions.HTTPError as err:
    print(f"خطای HTTP رخ داد: {err}")
except requests.exceptions.ConnectionError as err:
    print(f"خطای اتصال رخ داد: {err}")
except requests.exceptions.Timeout as err:
    print(f"خطای تایم‌اوت رخ داد: {err}")
except requests.exceptions.RequestException as err:
    print(f"خطای نامشخصی رخ داد: {err}")
    

توصیه میشه هميشه از try...except برای مدیریت خطاها استفاده کنی تا برنامه‌ات crash نکنه و بتونی مشکلات رو به درستی هندل کنی.

نکته مهم: همیشه حواست به مدیریت خطاها باشه. هیچ‌وقت فرض نکن درخواستت موفقیت‌آمیز بوده. یه برنامه‌نویس خوب همیشه بدترین سناریو رو هم در نظر می‌گیره! برای کدهای آماده و نمونه‌های بیشتر به صفحه اسنیپت‌های ما سر بزن.

امکانات پیشرفته برای حرفه‌ای‌ها

requests فقط برای کارهای ساده نیست. کلی امکانات پیشرفته داره که می‌تونه بهت تو سناریوهای پیچیده‌تر کمک کنه.

احراز هویت (Authentication)

اگه با APIهایی کار می‌کنی که نیاز به احراز هویت دارن، requests گزینه‌های مختلفی رو ارائه میده. رایج‌ترین‌ها Basic Authentication و Digest Authentication هستن:


import requests
from requests.auth import HTTPBasicAuth # برای Basic Auth

# Basic Authentication
url_basic = "https://httpbin.org/basic-auth/user/pass"
response_basic = requests.get(url_basic, auth=HTTPBasicAuth('user', 'pass'))
print(f"Basic Auth Status: {response_basic.status_code}")
print(f"Basic Auth Content: {response_basic.text}")

# Digest Authentication
# url_digest = "http://httpbin.org/digest-auth/auth/user/pass" # httpbin ممکنه digest auth رو مستقیم پشتیبانی نکنه
# from requests.auth import HTTPDigestAuth
# response_digest = requests.get(url_digest, auth=HTTPDigestAuth('user', 'pass'))
# print(f"Digest Auth Status: {response_digest.status_code}")
# print(f"Digest Auth Content: {response_digest.text}")
    

برای APIهای جدیدتر که از Tokenها (مثل Bearer Token) استفاده می‌کنن، معمولاً باید توکن رو به عنوان یه هدر Authorization بفرستی، مثل کاری که تو بخش هدرها یاد گرفتیم.

تنظیم تایم‌اوت (Timeout)

گاهی اوقات، سرور ممکنه دیر پاسخ بده یا اصلاً پاسخ نده. برای جلوگیری از اینکه برنامه‌ات بی‌نهایت منتظر بمونه، می‌تونی یه تایم‌اوت (بر حسب ثانیه) تنظیم کنی. اگه سرور تو این مدت پاسخ نداد، requests یه استثنا Timeout میندازه.


import requests

try:
    # 0.001 ثانیه خیلی کمه و تقریبا همیشه تایم‌اوت میده برای تست
    response = requests.get("https://httpbin.org/delay/5", timeout=2) # 5 ثانیه delay داره، ما 2 ثانیه تایم‌اوت دادیم
    print(f"پاسخ دریافت شد: {response.text}")
except requests.exceptions.Timeout:
    print("درخواست به دلیل تایم‌اوت ناموفق بود.")
except requests.exceptions.RequestException as e:
    print(f"خطای دیگری رخ داد: {e}")
    

تایم‌اوت رو عاقلانه انتخاب کن! اگه خیلی کم باشه، درخواست‌های سالم رو هم از دست میدی. اگه خیلی زیاد باشه، برنامه‌ات کند میشه.

استفاده از Session‌ها

وقتی چند تا درخواست به یک دامنه می‌فرستی (مثلاً لاگین می‌کنی، بعد اطلاعات پروفایلتو می‌گیری)، استفاده از Session‌ها خیلی به کارت میاد. Sessionها کوکی‌ها و هدرها رو بین درخواست‌ها نگه می‌دارن و باعث میشن ارتباطت با سرور کارآمدتر و سریع‌تر باشه.


import requests

with requests.Session() as s:
    # درخواست اول: کوکی تنظیم میشه (httpbin یک کوکی تست تنظیم می‌کنه)
    s.get("https://httpbin.org/cookies/set/sessioncookie/12345")
    
    # درخواست دوم: کوکی‌های قبلی ارسال میشن
    response = s.get("https://httpbin.org/cookies")
    print("کوکی‌های موجود در سشن:")
    print(response.json())
    

همونطور که می‌بینی، کوکی که تو درخواست اول ست شد، به صورت خودکار تو درخواست دوم هم ارسال شد. این برای سایت‌هایی که نیاز به لاگین یا حفظ وضعیت دارن، حیاتیه.

پراکسی‌ها (Proxy)

برای عبور از محدودیت‌های جغرافیایی، مخفی کردن IP یا دسترسی به منابعی که از طریق شبکه مستقیمت امکان‌پذیر نیستن، می‌تونی از پراکسی استفاده کنی. requests این قابلیت رو هم به سادگی در اختیارت می‌ذاره.


import requests

proxies = {
    "http": "http://user:pass@10.10.1.10:3128", 
    "https": "http://user:pass@10.10.1.10:1080", 
}

# این فقط یک مثال است، برای استفاده واقعی باید آدرس پراکسی معتبر داشته باشید.
# try:
#     response = requests.get("http://example.com", proxies=proxies, timeout=5)
#     print(response.status_code)
# except requests.exceptions.RequestException as e:
#     print(f"خطا در استفاده از پراکسی: {e}")
    

توجه: استفاده از پراکسی نامعتبر یا پراکسی‌های رایگان عمومی می‌تونه خطرناک باشه و باعث لو رفتن اطلاعاتت بشه.

عیب‌یابی سریع (Troubleshooting): مشکلات رایج و راه‌حل‌ها

تو مسیر برنامه‌نویسی با requests حتماً به مشکلاتی برمی‌خوری. نگران نباش، اینا رایجن و راه‌حل دارن. در این بخش، به رایج‌ترین مشکلات برنامه نویسان و نحوه رفع اونا می‌پردازیم.

جدول عیب‌یابی مشکلات requests 🛠️

مشکل احتمالی 🛑 راه‌حل 💡
requests.exceptions.ConnectionError
  • آدرس URL رو چک کن، شاید اشتباه تایپ شده.
  • مطمئن شو اینترنت داری و سرور در دسترس هست.
  • فایروال یا پراکسی ممکنه جلوی اتصال رو گرفته باشه.
requests.exceptions.HTTPError (کدهای 4xx یا 5xx)
  • 400 Bad Request: پارامترها یا بدنه درخواستت اشتباهه. API داکیومنت رو چک کن.
  • 401/403 Unauthorized/Forbidden: مشکل احراز هویت داری. توکن یا نام کاربری/رمز عبورت رو چک کن. شاید نیاز به آموزش‌های پیشرفته پایتون برای مدیریت توکن‌ها داری.
  • 404 Not Found: آدرس URL یا منبعی که می‌خوای بهش دسترسی پیدا کنی، وجود نداره.
  • 5xx Server Error: مشکل از سمت سروره، نه از کد تو. می‌تونی مجدداً امتحان کنی یا با مدیر سرور تماس بگیری.
requests.exceptions.Timeout
  • تایم‌اوت رو بیشتر کن (timeout=X).
  • سرور ممکنه کند باشه یا شبکه مشکل داشته باشه.
پاسخ JSON نامعتبر
  • قبل از response.json()، مطمئن شو response.headers['Content-Type'] برابر با application/json باشه.
  • گاهی سرور با وجود مشکل، HTML برمی‌گردونه. از try-except json.JSONDecodeError استفاده کن.
مشکل در ارسال هدرها یا پارامترها
  • از دیکشنری پایتون برای params و headers استفاده کن و مطمئن شو که ساختارشون درست باشه.
  • کلیدها و مقادیر هدرها به حروف کوچک و بزرگ حساس نیستند اما بهتر است که استاندارد را رعایت کرد.
سرور پاسخ درستی نمی‌دهد (مشکل CORS یا Cross-Origin Resource Sharing)
  • این مشکل بیشتر برای فرانت‌اند (JavaScript) پیش میاد، اما اگه از requests تو پایتون با سروری کار می‌کنی که CORS رو سفت و سخت پیاده کرده، ممکنه با مشکل مواجه بشی. راه حلش معمولاً تغییر هدر Origin یا استفاده از پراکسی است.
  • مطمئن شو سرور اجازه دسترسی از آدرس تو رو میده.

یادگیری مهارت‌های برنامه‌نویسی پایتون مداوم هست. همیشه داکیومنت‌ها رو بخون و از ابزارهایی مثل httpbin.org برای تست کمک بگیر.

کلام آخر

خب رفیق، تا اینجا کلی درباره requests یاد گرفتیم. از نحوه نصب و ارسال درخواست‌های ساده GET و POST گرفته تا مدیریت هدرها، احراز هویت، تایم‌اوت و استفاده از Sessionها. این کتابخونه یه ابزار قدرتمند و انعطاف‌پذیره که کار با HTTP رو تو پایتون به یه تجربه لذت‌بخش تبدیل می‌کنه. مهم نیست داری یه اسکریپت ساده می‌نویسی یا یه ربات پیچیده برای جمع‌آوری اطلاعات، requests همیشه کنارته.

هميشگي یادت باشه که تمرین کلید موفقیته. با مثال‌هایی که اینجا دیدی و کمی تغییر توشون، می‌تونی کلی چیز یاد بگیری. برو سراغ APIهای عمومی مثل JSONPlaceholder یا httpbin.org و کلی بازی باهاشون دربیار. اگه بازم سوالی داشتی، فراموش نکن که وبسایت ما پر از اسنیپت‌ها و آموزش‌های بدرد بخور دیگه‌ست که می‌تونه کمکت کنه. تو راهت موفق باشی!

🚀 آماده‌ای که پروژه‌های پایتونت رو به اوج برسونی؟ همین الان کلیک کن و ابزارهای پایتون ما رو کشف کن!

Table of Contents

آخرین نوشته‌ها