

در این مقاله بهصورت عملی و مرحلهبهمرحله یاد میگیریم چطور یک پروژه Scrapy را برای اجرا در محیط سرور آماده کنیم، آن را مانیتور و هشداردهی کنیم، بهصورت برنامهریزیشده اجرا نماییم و خروجیها را در یک دیتابیس PostgreSQL ذخیره کنیم. مخاطب این راهنما توسعهدهنده پایتون با سطح متوسط است؛ پس علاوه بر دستورالعملها مثالهای کد، نکات امنیتی، و روشهای رفع خطا را هم میبینید.
اسکریپینگ در مقیاس تولید بدون مانیتورینگ قابل اعتماد و راهاندازی مناسب بهسختی پایدار میماند. مانیتورینگ به شما کمک میکند خطاها، افت نرخ موفقیت، یا بلاکشدن آیپی را زود تشخیص دهید و زمانبندی (scheduling) تضمین میکند دادههایتان بهروز باقی بمانند.
برای ارسال آمار اجرای اسپایدرها و دریافت داشبورد و آلارتها از افزونههایی مثل ScrapeOps استفاده میکنیم. ابتدا بسته مربوطه را نصب کنید:
pip install scrapeops-scrapyدر ادامه، مقداردهی در settings.py. بهجای قرار دادن کلید بهصورت صریح در فایل، بهتر است آن را از متغیر محیطی بخوانید:
import os
# گرفتن کلید از متغیر محیطی برای امنیت
SCRAPEOPS_API_KEY = os.getenv('SCRAPEOPS_API_KEY')
# فعال کردن افزونه
EXTENSIONS = {
'scrapeops_scrapy.extension.ScrapeOpsMonitor': 500,
}
# بروزرسانی middleware های retry
DOWNLOADER_MIDDLEWARES = {
'scrapeops_scrapy.middleware.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': None,
}
توضیح: SCRAPEOPS_API_KEY ورودی است از محیط؛ EXTENSIONS افزونهٔ مانیتورینگ را ثبت میکند و در DOWNLOADER_MIDDLEWARES جایگزینی middleware پیشفرض retry انجام میشود تا آمار دقیق به ScrapeOps ارسال شود.
یک فایل requirements.txt درست کنید تا سرور بتواند وابستگیها را نصب کند. نمونهای از محتوای این فایل:
scrapeops-scrapy==0.4.6
Scrapy==2.6.1
scrapy-proxy-pool==0.1.9
scrapy-user-agents==0.1.1
psycopg2-binary==2.9.6
SQLAlchemy==1.4.0اگر پروژهٔ شما بستههای بیشتری دارد میتوانید از محیط مجازی محلی خود خروجی بگیرید:
pip freeze > requirements.txtنکات عملی:
برای اجرا 24/7 به یک VPS نیاز دارید. تنظیمات پایه که پیشنهاد میشود:
در سرور باید کاربر مجزا برای اجرای وظایف ایجاد کنید، و وابستگیها را داخل یک محیط مجازی نصب کنید. اگر با ابزارهایی مانند ScrapeOps کار میکنید، معمولاً فرآیند نصب و کاربر جدید و کلیدها را خود سرویس یا اسکریپت نصب انجام میدهد.
بهجای SSH و اجرای دستی git clone میتوانید سرور را در داشبورد ScrapeOps اضافه کنید و از آنجا مخزن گیتهاب را کلون کنید. مراحل کلی:
اگر Clone با خطا مواجه شد، پیام خطا را در صفحهٔ خطاها ببینید. خطاهای رایج:
معمولاً اسکریپت نصب مراحل زیر را انجام میدهد:
اگر میخواهید اسکریپت نصب را بررسی یا شخصیسازی کنید، مطمئن شوید که تنظیمات مربوط به محیط و متغیرهای کلیدی قبل از اجرا مقداردهی شدهاند.
برای اجرای دستی از سرور یا محلی میتوانید از دستور زیر استفاده کنید:
scrapy crawl myspiderاین دستور ورودی: نام اسپایدر (myspider)؛ خروجی: اجرای اسپایدر و تولید آیتمها/فایلها یا ارسال به پایپلاینها. اگر از ScrapeOps استفاده میکنید، افزونه آمار اجرای این job را به داشبورد میفرستد.
برای اجرای دورهای، ScrapeOps از مکانیزمی استفاده میکند که در نهایت یک کرونjob روی سرور ثبت میکند؛ نکات مهم:
یکی از گزینههای معمول ذخیرهسازی داده، گذاشتن خروجی در یک دیتابیس PostgreSQL است. در ادامه یک نمونه پایپلاین ساده با استفاده از psycopg2 و SQLAlchemy آورده شده است. این مثال ورودی: آیتمهای Scrapy؛ خروجی: ردیفهای درجشده در جدول postgres.
# pipelines.py
import os
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
from sqlalchemy.exc import SQLAlchemyError
DB_URL = os.getenv('DATABASE_URL') # example: postgres://user:pass@host:5432/dbname
class PostgresPipeline:
def __init__(self):
if not DB_URL:
raise RuntimeError('DATABASE_URL environment variable not set')
self.engine = create_engine(DB_URL)
self.metadata = MetaData()
# تعریف سادهٔ جدول؛ در پروژهٔ واقعی از migrations استفاده کنید
self.items_table = Table('scraped_items', self.metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('url', String))
self.metadata.create_all(self.engine)
def open_spider(self, spider):
self.conn = self.engine.connect()
def close_spider(self, spider):
self.conn.close()
def process_item(self, item, spider):
try:
ins = self.items_table.insert().values(title=item.get('title'), url=item.get('url'))
self.conn.execute(ins)
except SQLAlchemyError as e:
spider.logger.error('DB insert error: %s', e)
return item
توضیح خطبهخط:
نکات عملی برای دیتابیس:
برای داشتن یک استقرار قابل اطمینان توجه کنید به:
چند توصیه امنیتی که اغلب نادیده گرفته میشود:
خطاهای رایج و راهحل سریع:
برای استقرار و زمانبندی اسکریپینگ با Scrapy، چهار مرحلهٔ کلیدی وجود دارد: آمادهسازی پروژه (requirements و تنظیمات)، راهاندازی سرور امن، اتصال و کلون از داشبورد مانیتورینگ، و در نهایت زمانبندی اجراها و ذخیرهٔ دادهها بهصورت مطمئن در دیتابیس. رعایت نکات امنیتی، استفاده از متغیرهای محیطی برای کلیدها، و مانیتورینگ مستمر باعث میشود اسکریپها پایدار و قابل اعتماد اجرا شوند.
اگر زمانبندی و اجرای اتوماتیک برایتان اهمیت دارد، بهتر است از قفلینگ اجرا، بررسی وضعیت قبل از شروع job، و هشدارهای آنی در صورت خطا استفاده کنید تا از اجرای موازی یا از دست رفتن داده جلوگیری شود.

