יישום עיבוד נתונים עם Scrapy (Python)
אתה צריך לאסוף 100,000 עמודי מוצר ביום. Requests + BeautifulSoup לוקחים שבוע, וגם זה עם הפסקות. Scrapy פותר את זה ביום — זהו מסגרת גירוד אתרים תעשייתית ל-Python. בניגוד לפתרונות מותאמים אישית, Scrapy מספקת תור בקשות מובנה, מערכת middleware, צינור עיבוד נתונים, תמיכה ב-robots.txt, סיבוב אוטומטי של User-Agent, וקאש. הצוות שלנו משתמש בזה בייצור למעלה מ-5 שנים ויישם יותר מ-30 פרויקטי גירוד עבור חנויות מקוונות, אגרגטורים ומרקטפלייסים. אנו מבטיחים איסוף נתונים יציב גם תחת הגנה מורכבת — הניסיון מראה ש-95% מהסשנים רצים ללא שגיאות.
למה Scrapy עדיפה על אגרגטורי גירוד מוכנים?
שירותים מוכנים כמו Octoparse או Parsehub מתאימים למשימות חד-פעמיות, אבל בהיקפים תעשייתיים הם נתקלים במגבלות: מגבלות על מספר עמודים, קוד סגור, וחוסר יכולת לכוונון עדין. Scrapy נותנת שליטה מלאה: אתה מחליט איך להתמודד עם captchas, באיזו תדירות להחליף פרוקסי, ואיך לאחסן נתונים. בפרויקט אחד, הגדלנו את מהירות האיסוף פי 4 על ידי החלפת סקריפט מותאם אישית על requests+bs4 ב-Scrapy עם בקשות מקבילות. מהנדס ממוצע מגדיר spider ביומיים, לא בשבוע — מה שמפחית עלויות ב-60%.
ארכיטקטורת Scrapy
Spider (логика обхода)
↓
Scrapy Engine
↓
Scheduler (очередь URL)
↓
Downloader (HTTP-запросы)
↓
(через Downloader Middlewares)
Response → Spider
↓
Items → Item Pipeline
↓
Storage (DB, CSV, JSON, S3)כל רכיב ניתן להחלפה: אתה יכול להוסיף תור משלך (Redis דרך Spider (логика обхода) ↓ Scrapy Engine ↓ Scheduler (очередь URL) ↓ Downloader (HTTP-запросы) ↓ (через Downloader Middlewares) Response → Spider ↓ Items → Item Pipeline ↓ Storage (DB, CSV, JSON, S3) ), מוריד משלך (Playwright דרך scrapy-redis), או צינור משלך. זה הופך את המסגרת למתאימה למשימות בכל מורכבות.
איך להרחיב את Scrapy עם Redis?
לאיסוף מבוזר על פני מספר שרתים:
# settings.py
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
REDIS_URL = 'redis://redis:6379'
SCHEDULER_PERSIST = True # очередь не сбрасывается при перезапускеעם scrapy-playwright, מספר עובדים קוראים מתור Redis משותף — הרחבה אופקית ללא שינוי בקוד ה-spider. זה מאפשר עיבוד מיליוני כתובות URL ביום.
למה להגדיר Middleware כדי לעקוף הגנה?
class RotateUserAgentMiddleware:
agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...',
]
def process_request(self, request, spider):
request.headers['User-Agent'] = random.choice(self.agents)בנוסף, אנו מחברים # settings.py SCHEDULER = 'scrapy_redis.scheduler.Scheduler' DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' REDIS_URL = 'redis://redis:6379' SCHEDULER_PERSIST = True # очередь не сбрасывается при перезапуске לסיבוב פרוקסי אוטומטי עם מעקב אחר מצב כל כתובת. בתרחישים מורכבים, אנו משתמשים ב-scrapy-redis עם דפדפן headless — זה משיג 95% בקשות מוצלחות גם תחת Cloudflare. לקוח אחד לאחר יישום תוכנית כזו הפחית את זמן האיסוף ב-70%.
צינור עבור PostgreSQL
class PostgreSQLPipeline:
def open_spider(self, spider):
self.conn = psycopg2.connect(DATABASE_URL)
self.cur = self.conn.cursor()
def process_item(self, item, spider):
self.cur.execute(
'INSERT INTO products (title, price, url) VALUES (%s, %s, %s) '
'ON CONFLICT (url) DO UPDATE SET price = EXCLUDED.price',
(item['title'], item['price'], item['url'])
)
self.conn.commit()
return item
class RotateUserAgentMiddleware: agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...', ] def process_request(self, request, spider): request.headers['User-Agent'] = random.choice(self.agents) מטפל בדה-דופליקציה ברמת מסד הנתונים ללא בדיקות נוספות בקוד. בפרויקט אחד, זה הפחית את נפח הנתונים המאוחסנים ב-30%.
ניטור וסטטיסטיקות
Scrapy כותבת סטטיסטיקות מפורטות לכל ריצה: מספר בקשות, פריטים מעובדים, שגיאות, זמן תגובה ממוצע. דרך scrapy-rotating-proxies, מדדים אלה מיוצאים ל-Prometheus ומוצגים ב-Grafana. אנו מוסיפים התראות על ירידות במהירות האיסוף או על עלייה במספר השגיאות — כך שאתה תמיד יודע על בעיות.
מקרה בוחן: גירוד קטלוג של 200,000 מוצרים
היינו צריכים לאסוף נתונים מחנות מקוונת המוגנת על ידי Cloudflare. השתמשנו ב-scrapy-playwright עם דפדפן headless וסיבוב פרוקסי. ה-spider עיבד 50 עמודים בדקה, עם פחות מ-1% שגיאות. אינטגרציה עם PostgreSQL דרך צינור עם scrapy-playwright אפשרה עדכון מחירים ללא כפילויות. כל הפרויקט ארך 8 ימים, כולל הגדרת ניטור ב-Grafana. הלקוח קיבל מערכת מוכנה עם יכולת להוסיף מקורות חדשים ללא שכתוב קוד.
מה כלול בפיתוח גירוד עם Scrapy?
- עיצוב ארכיטקטורת spider עבור מקורות הנתונים שלך
- הגדרת middleware: סיבוב פרוקסי, User-Agent, עוגיות
- יישום צינורות לניקוי, ולידציה ואחסון נתונים
- אינטגרציה עם מסד הנתונים או אחסון הענן שלך
- הכנת ניטור (Grafana, התראות)
- תיעוד להשקה ולתמיכה
- הכשרת המפתח שלך לעבודה עם המערכת
Scrapy לעומת גישות אחרות
| תכונה | Scrapy | Requests + BeautifulSoup | Octoparse |
|---|---|---|---|
| מהירות איסוף (עמודים/דקה) | 200+ | 30–50 | 100–150 |
| יכולת הרחבה לעשרות מכונות | כן | לא | מוגבלת |
| הגדרת פרוקסי ו-User-Agent | מובנה | ידני | חלקי |
| יכולת עקיפת Cloudflare | דרך Playwright | קשה | מובנה |
| רישיון | קוד פתוח | קוד פתוח | קנייני |
| שליטה בקוד | מלאה | מלאה | סגורה |
לוחות זמנים
| סוג עבודה | לוח זמנים |
|---|---|
| Spider פשוט לאתר אחד | 3–5 ימים |
| Spider עם אינטגרציה למסד נתונים וניטור | 7–10 ימים |
| מערכת מבוזרת (Redis + מספר מקורות) | 10–15 ימים |
| פרויקט מורכב עם עקיפת הגנה ו-captcha | משבועיים |
צור קשר
קבל ייעוץ לפרויקט הגירוד שלך. נעריך את המשימה ביום עסקים אחד ונציע פתרון אופטימלי. הזמן פיתוח — בואו נדון בפרטים.







