تست استخدام توسعه‌دهنده Python

آزمون عملی برای ارزیابی مهارت‌های شما در توسعه Python، اسکرپینگ وب، رفع اشکال و ریفکتورینگ کد

2-3 ساعت زمان تخمینی
100 امتیاز کل
3 بخش اصلی
بخش ۱ از ۳

Google Search Rank Finder (دامنه + کلیدواژه)

60 امتیاز

هدف این بخش، ساخت یک سرویس کوچک است که با دریافت دامنه وب‌سایت و کلیدواژه جستجو (مثلاً adidas.com و sport shoes)، رتبه (Rank) آن دامنه را در نتایج جستجوی گوگل پیدا کند و خروجی قابل استفاده برای سیستم‌های دیگر ارائه دهد.

شرح تسک و مراحل مورد انتظار:

جستجو و استخراج رتبه از نتایج گوگل

  • ورودی: domain و keyword
  • خروجی: rank (از 1 شروع می‌شود). اگر دامنه پیدا نشد، مقدار مناسب (مثل null) برگردانید
  • تعریف دقیق رتبه: فقط نتایج ارگانیک (Organic Results)؛ تبلیغات/کارت‌ها/ویجت‌ها را در رتبه‌گذاری لحاظ نکنید
  • تطبیق دامنه: زیردامنه‌ها و حالت‌های مختلف URL را مدیریت کنید (مثل www. و m.)
  • حداکثر صفحه/نتایج قابل تنظیم باشد (مثلاً فقط صفحه اول یا تا N نتیجه)

API Integration (بخش ۲)

  • سرویس باید از طریق یک API قابل فراخوانی باشد تا کلاینت‌ها بتوانند با ارسال دامنه و کلیدواژه رتبه را دریافت کنند
  • پیشنهاد مسیر:
    • POST /api/rank
  • نمونه درخواست (JSON):
    {
      "domain": "adidas.com",
      "keyword": "sport shoes",
      "max_results": 100
    }
  • نمونه پاسخ (JSON):
    {
      "domain": "adidas.com",
      "keyword": "sport shoes",
      "rank": 7,
      "checked_results": 100,
      "found_url": "https://www.adidas.com/...",
      "status": "ok"
    }
  • اگر دامنه پیدا نشد: "rank": null و یک status مشخص برگردانید
  • مدیریت خطاها: ورودی نامعتبر (400)، بلاک/کپچا/429 (503/429 با پیام شفاف)، تایم‌اوت (504) و خطاهای غیرمنتظره (500)
  • مستندسازی کوتاه داخل پروژه (در README یا در توضیحات API) برای نحوه اجرا و نمونه فراخوانی

پردازش همزمان (Concurrency)

  • سرویس باید بتواند چند درخواست را همزمان پردازش کند (روش پیاده‌سازی با شما: async/threading/multiprocessing)
  • یک محدودیت همزمانی (Concurrency Limit) و Rate Limit منطقی در نظر بگیرید تا به IP سازمان آسیبی نرسد
  • در صورت نیاز به محافظت بیشتر، به جای تلاش‌های متعدد روی گوگل، خطا را برگردانید و از تلاش‌های پشت‌سرهم خودداری کنید

نکات مهم (الزامی)

بخش ۲ از ۳

رفع اشکال و ریفکتورینگ

30 امتیاز

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

کد اولیه (دارای مشکل):

import requests
from bs4 import BeautifulSoup
import time

def get_products(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    products = []
    items = soup.find_all('div', class_='product-item')
    
    for item in items:
        name = item.find('h3').text
        price = item.find('span', class_='price').text
        price = price.replace('$', '')
        products.append({'name': name, 'price': price})
    
    return products

def scrape_all_pages():
    base_url = 'https://example-shop.com/products?page='
    all_products = []
    
    for page in range(1, 100):
        url = base_url + str(page)
        products = get_products(url)
        all_products.extend(products)
        time.sleep(0.1)
    
    return all_products

products = scrape_all_pages()
print(products)

وظیفه ۱: شناسایی مشکلات (10 امتیاز)

  • حداقل 5 مشکل یا نقطه ضعف در کد بالا را لیست کنید
  • توضیح دهید چرا هر مورد مشکل است

وظیفه ۲: ریفکتور کد (30 امتیاز)

  • مدیریت خطا (Error Handling) مناسب اضافه کنید
  • از بهترین شیوه‌های Python استفاده کنید
  • کد را ماژولار و قابل استفاده مجدد کنید
  • مدیریت صفحات خالی و پایان لیست را اضافه کنید
  • از type hints استفاده کنید
  • docstring مناسب برای توابع بنویسید
بخش ۳ از ۳

تست و کیفیت کد

10 امتیاز

Unit Tests (10 امتیاز)

  • حداقل 5 تست برای توابع مختلف
  • استفاده از pytest یا unittest
  • Mock کردن درخواست‌های HTTP

مستندات (5 امتیاز)

  • فایل README.md کامل
  • توضیح معماری کد
  • مثال‌های استفاده

کیفیت کد (5 امتیاز)

  • رعایت PEP 8
  • استفاده از linter
  • کد تمیز و خوانا

ساختار پیشنهادی پروژه:

project/
├── README.md
├── requirements.txt
├── config.py
├── scraper/
│   ├── __init__.py
│   ├── base_scraper.py
│   ├── product_scraper.py
│   └── utils.py
├── storage/
│   ├── __init__.py
│   ├── json_handler.py
│   └── csv_handler.py
├── tests/
│   ├── __init__.py
│   └── test_scraper.py
└── main.py

نکات مهم (الزامی)