ساده ترین نسخه#
کلاس کردن پاسخ قبل از تجدید نظر. A 403 ممکن است نشان دهنده یک قانون دسترسی باشد که IP دیگر حل نخواهد شد. برای 429، احترام به retry-After و کاهش نرخ درخواست؛ استفاده از backoff برای اتصال موقت یا خرابی های سرور.
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()}یک واسطه برای جلسات چسبنده در هر آیتم#
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}"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 کنترل های مختلف است.یک جلسه مشتری از سوکت ها استفاده می کند؛ تنها دروازه تعیین کننده چرخش و رفتار چسبنده-session است.استفاده از پارامترهای جلسه ارائه شده با خدمات شما و تأیید خروجی بیش از چندین درخواست. بستن سوکت یا ارسال اتصال: نزدیک تضمین IP مختلف.
نگه داشتن لایحه#
- Wastey تصاویر یا اسکریپت ها را بارگذاری نمی کند؛ HTML و JSON فقط یک صفحه اندازه HTML آن را هزینه می کند.
- قابلیت فشرده سازی (default) و اجتناب از
Splashیا ارائه مرورگر مگر اینکه داده ها به آن نیاز داشته باشند. - پنهان کردن با
HTTPCACHE_ENABLED = Trueدر طول توسعه، شما پرداخت نمی کنید تا دوباره همان صفحات را در حالی که انتخاب کنندگان اشکال زدایی.
مودبانه بودن Per-domain#
استخر یک راه برای بسیاری از بازدید کنندگان مودبانه است، نه یک مهمان. CONCURRENT_REQUESTS_PER_DOMAIN و AutoThrottle هر هدف را با نرخ انسانی در هر خروجی حفظ می کند؛ استفاده قابل قبول از سیاست هر چیزی را که شبیه حمله به نظر می رسد، ممنوع می کند.
پرسش هایی که مردم می پرسند#
آیا نیاز به تعمیر و نگهداری دارم؟
نه با دروازه: چرخش در سمت کلیدی Proxy برای هر اتصال جدید اتفاق می افتد، این بسته لیستی از پروکسی های استاتیک را مدیریت می کند؛ با res.proxy-cyber.com یک پروکسی برای پیکربندی وجود دارد.
چگونه از یک کشور مختلف به هر درخواست استفاده کنیم؟
درخواست را تنظیم کنید.meta [کشور] در عنکبوت و خواندن آن در واسطه برای ساخت پارامتر-cc؛ مثال از یک تنظیمات واحد برای بازگشت استفاده می کند.