שילובים · ביניים

פרוקסי מסתובב ודביק ב-Scrapy עם תוכנת אמצע להוריד

HttpProxyMiddware של סקראפי תומך פרוקסי HTTP מאומת באמצעות request.meta["פרוקסי"]. הגדר את השער בפועל נמסר, להפיץ את ההגדרה לבקשות מעקב ולאמת את מצב ההפעלה שהוקצה לפני הגדלת המבטא.

2 דקות קריאה 4 חלקים חוות דעת צוות העריכה Proxy Cyber

הגרסה הפשוטה ביותר#

סיווג התגובה לפני ניסיון חוזר. 403 עשוי להצביע על כלל גישה ש-IP אחר לא יפתור. עבור 429, כבד את שיעור ה-Retry-After וצמצם את הבקשה; השתמש בגיבוי מוגבל לחיבור זמני או כשלי שרת. נסה פעולות לשינוי מצב רק כאשר אתה יכול למנוע פעולות כפולות.

עכביש.py
import scrapy

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"

class PricesSpider(scrapy.Spider):
    name = "prices"
    start_urls = ["https://example.com/catalog"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, meta={"proxy": PROXY})

    def parse(self, response):
        for href in response.css("a.product::attr(href)").getall():
            yield response.follow(href, callback=self.parse_product, meta={"proxy": PROXY})

    def parse_product(self, response):
        yield {"url": response.url, "price": response.css(".price::text").get()}

אמצעי עבור פגישות דביקות לכל פריט#

Middlewares.py
import hashlib

class Proxy CyberMiddleware:
    GATEWAY = "res.proxy-cyber.com:9000"

    def __init__(self, user, password, country):
        self.user, self.password, self.country = user, password, country

    @classmethod
    def from_crawler(cls, crawler):
        s = crawler.settings
        return cls(s.get("KEY_PROXY_USER"), s.get("KEY_PROXY_PASS"), s.get("KEY_PROXY_COUNTRY", "us"))

    def process_request(self, request, spider):
        # Sticky when the request carries a session key (e.g. one per product flow), rotating otherwise
        key = request.meta.get("session_key")
        user = f"{self.user}-cc-{self.country}"
        if key:
            sid = hashlib.sha1(key.encode()).hexdigest()[:12]
            user += f"-sid-{sid}-ttl-10m"
        request.meta["proxy"] = f"http://{user}:{self.password}@{self.GATEWAY}"
הגדרות.py
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.Proxy CyberMiddleware": 350,   # before HttpProxyMiddleware (750)
}
KEY_PROXY_USER = "USER"
KEY_PROXY_PASS = "PASS"
KEY_PROXY_COUNTRY = "de"

CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 8
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
DOWNLOAD_TIMEOUT = 45
RETRY_ENABLED = True
RETRY_TIMES = 2
RETRY_HTTP_CODES = [408, 429, 500, 502, 503, 504, 522, 524]
COMPRESSION_ENABLED = True

חיבור חוזר ומשימות IP הן פקדים שונים. מושב לקוח משתמש שקעים; רק את המחוג שהוקצה רוטציה הפעלה דביקה התנהגות. השתמש פרמטרים ההפעלה שסופקו עם השירות שלך, ולאמת את היציאה על פני כמה בקשות. סגירת שקע או שליחת חיבור: סגור אינו מבטיח IP שונה.

שמירה על החשבון למטה#

  • Scrapy אינו טוען תמונות או סקריפטים; HTML ו-JSON בלבד, כך שדף עולה את גודל ה-HTML שלו.
  • אפשר דחיסה (ברירת מחדל) ומנע Splash או דפדפן, אלא אם כן הנתונים צריכים את זה.
  • מטמון עם HTTPCACHE_ENABLED = True במהלך הפיתוח, אתה לא משלם כדי להביא מחדש את אותם דפים בעת ניפוי באגים בוררים.

נימוס לכל תחום#

מאגר כתובות היא דרך להיות מבקרים מנומסים רבים, לא אחד לא מנומס. CONCURRENT_REQUESTS_PER_DOMAIN AutoThrottle לשמור על כל יעד בשיעור סביר לאדם ליציאה; מדיניות שימוש מקובלת אוסר על כל דבר שנראה כמו התקפה.

שאלות שאנשים שואלים#

האם אני צריך גרוטאות מסתובבות-proxys?

לא עם שער: רוטציה קורה בצד Key פרוקסי עבור כל חיבור חדש. חבילה זו מנהלת רשימות של פרוקסי סטטי; עם res.proxy-cyber.com יש פרוקסי אחד להגדיר.

איך אני משתמש במדינה אחרת לפי בקשה?

הגדר request.meta ["מדינה"] בעכביש וקרא אותו בכלי האמצע כדי לבנות את -cc-פרמטר; הדוגמה משתמשת הגדרה אחת לקיצור.

החשבון שלך

נהלו את כל הפרוקסי בחשבון אחד

השווה רשתות, לבצע הזמנות ולעקוב אחר בקשות האיזון והתמיכה שלך מלוח מחוונים אחד. הצוות שלנו סוקר תשלומים ומספק פרטי חיבור לאחר הלידה.

יצירת חשבון