from scrapy.pipelines.images import ImagesPipeline

class ProxiedImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for request in super().get_media_requests(item, info):
            request.meta['proxy'] = 'http://proxy.example:8080'
            yield request

עבור Scrapy 2.13.3, החליפו את רשומת ImagesPipeline הרגילה ב-ITEM_PIPELINES בנתיב הייבוא של תת-המחלקה הזו. שמרו על IMAGES_STORE ועל שאר ההגדרות.

קריאה למחלקת האב משמרת את שדה כתובת ה-URL של התמונה ואת הקריאות החוזרות שהוגדרו בה. תת-המחלקה מוסיפה רק את מסלול הבקשה, שאותו HttpProxyMiddleware המופעל צורך. כל כתובת URL של תמונה נשארת היעד שלה. בקשות חדשות לתמונות ציבוריות בלי פרטי proxy יכולות להשתמש ברשומה מתוך רשימת ה-proxy של HTTP כאשר המסלול הזה מותר.

בקשות דפים שומרות על המדיניות שלהן. עם סביבת proxy גלובלית, meta={'proxy': None} הופך בקשת דף נבחרת לישירה בגרסה הזו.

בדקו שהורדה אכן נשלחה. פגיעת מטמון של ה-pipeline יכולה למנוע בקשת רשת. עבור העברות חדשות, השוו את רשומות התוצאה של תמונות שהושלמו לכתובות ה-URL שהתבקשו: פעולות מוצלחות מופיעות שם, ואילו כשלים יכולים להשאיר את שדה כתובת התמונה המקורי מלא. עקבו אחר תוצאות חסרות דרך יומני המוריד וה-proxy שנבחר.

מאמרים קשורים