Penerjemahan · Menengah

Proksi pengotasi dan lekat di Scrapy dengan middleware pengunduh

HttpProxyMiddleware milik Scrapy mendukung proksi HTTP yang diotentikasi melalui permintaan.meta["proxy"]. Atur gateway yang sebenarnya disampaikan, proport pengaturan untuk menindaklanjuti permintaan dan verifikasi mode sesi yang diberikan sebelum meningkatkan koncurrency.

2 min dibaca 4 bagian Disemak Pasukan editorial Proxy Cyber

Versi paling sederhana#

Mempelajari respon sebelum mencoba kembali. A 403 mungkin menunjukkan aturan akses bahwa IP lain tidak akan menyelesaikan. Untuk 429, hormati Coba-Setelah dan kurangi tingkat permintaan; gunakan backoff terikat untuk koneksi sementara atau kegagalan server. Coba lagi operasi perubahan-negara hanya ketika Anda dapat mencegah tindakan duplikat.

laba-laba.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()}

A middleware untuk sesi lekat per item#

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}"
settings.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

Tugas penggunaan ulang dan IP tanpa sambungan adalah kontrol yang berbeda. Sesi klien menggunakan kembali soket; hanya gateway yang ditugaskan menentukan rotasi dan perilaku sesi lengket. Gunakan parameter sesi yang diberikan dengan layanan Anda, dan memverifikasi keluar atas beberapa permintaan. Menutup soket atau mengirim Sambungan: menutup tidak menjamin IP yang berbeda.

Tidak ada tagihan.#

  • Scrapy tidak memuat gambar atau skrip; HTML dan JSON saja, sehingga sebuah halaman membutuhkan biaya ukuran HTMLnya.
  • Mengaktifkan kompresi (default) dan hindari Splash Pemanfaatan atau perambanan kecuali data yang diperlukan.
  • Cache Cache dengan HTTPCACHE_ENABLED = True Selama pengembangan, anda tidak membayar untuk mengulang halaman yang sama ketika debugging memilih.

Kesopanan Per-domain#

Kolam renang adalah cara untuk menjadi banyak pengunjung sopan, tidak satu pun tidak sopan. CONCURRENT_REQUESTS_PER_DOMAIN Dan Auto Throttle menjaga setiap target pada tingkat yang wajar manusia per jalan keluar; Kebijakan penggunaan yang dapat diterima Melarang apapun yang terlihat seperti serangan.

Pertanyaan orang#

Apa aku perlu obat-obat-kotoran?

Tidak dengan gateway: rotasi terjadi pada sisi Proxy Cyber untuk setiap koneksi baru. Paket tersebut mengelola daftar proksi statik; dengan res.proxy-cyber.com ada satu proksi untuk dikonfigurasi.

Bagaimana saya menggunakan negara yang berbeda per permintaan?

Tetapkan request.meta["country"] di laba-laba dan membacanya di tengah-tengah untuk membangun parameter -cc-; contoh tersebut menggunakan satu set untuk brevity.

Akunmu

Urus semua proksi dalam satu akaun

Jaringan perbandingan, perintah tempat dan ikuti keseimbangan dan permintaan dukungan Anda dari satu dashboard. tim kami meninjau pembayaran dan menyediakan rincian koneksi setelah pengiriman.

Cipta akaun