Socks5Proxy

Tetapan proxy Scrapy, gunakan IP berbeza untuk setiap permintaan dengan meta proxy

Panduan untuk menyambung HTTP proxy Socks5Proxy ke meta proxy dalam Scrapy, middleware pemuat turun yang memutar senarai dari API untuk setiap permintaan, dan tetapan kelajuan untuk laman web sasaran.

Bagaimana Scrapy mengendalikan proxy?

Scrapy mempunyai HttpProxyMiddleware yang diaktifkan secara lalai. Jika anda menambah alamat proxy dalam kamus meta permintaan dengan kunci proxy, permintaan tersebut akan melalui proxy tersebut, dan nama pengguna dan kata laluan dalam alamat akan ditukar menjadi header Proxy-Authorization oleh middleware. Alamat HTTPS melalui terowong CONNECT.

Pengendali pengunduh lalai Scrapy menyokong HTTP proxy. Jika SOCKS5 diperlukan, pengendali berasingan diperlukan, jadi disarankan untuk menggunakan port HTTP IP yang sama dalam Scrapy. IP yang dilihat oleh laman sasaran adalah sama.

Contoh menggunakan IP 198.51.100.23, port HTTP 8000, username spx_user, dan password spx_pass.

pip install scrapy
scrapy startproject shop
cd shop

Bagaimana menambah proxy pada satu permintaan?

Tambahkan proxy dalam meta ketika membuat Request dalam start_requests. Gunakan cara yang sama untuk menambah proksi dalam permintaan halaman seterusnya dalam callback. Untuk mengekalkan sesi yang sama, teruskan nilai proxy dari meta respons sebelumnya untuk mengekalkan IP yang sama.

import scrapy

PROXY = "http://spx_user:spx_pass@198.51.100.23:8000"

class IpCheckSpider(scrapy.Spider):
    name = "ip_check"

    def start_requests(self):
        yield scrapy.Request("https://api.ipify.org?format=json", meta={"proxy": PROXY})

    def parse(self, response):
        self.logger.info("seen as %s", response.json()["ip"])

Bagaimana memutar IP setiap permintaan?

Buat satu middleware pengunduh untuk memasukkan proxy seterusnya ke dalam semua permintaan supaya anda boleh berputar tanpa mengubah kod labah-labah. Middleware di bawah menerima senarai melalui API semasa permulaan, dan jika proxy sudah ada dalam meta, ia dibiarkan seperti itu untuk membolehkan penggunaan sesi tetap dan putaran bersama-sama.

Letakkan kunci API dalam settings.py atau baca dari pembolehubah persekitaran. Daftarkan nombor yang lebih awal daripada HttpProxyMiddleware(750) supaya middleware memproses alamat yang dimasukkan oleh middleware asas.

import itertools
import requests

class RotatingProxyMiddleware:
    def __init__(self, key):
        text = requests.get(
            "https://socks5proxy.io/api/v1/proxies/download",
            params={"format": "user:pass@ip:port", "protocol": "http"},
            headers={"Authorization": "Bearer " + key},
            timeout=30,
        ).text
        self.pool = itertools.cycle(["http://" + l.strip() for l in text.splitlines() if l.strip()])

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.get("SPX_API_KEY"))

    def process_request(self, request, spider):
        if "proxy" not in request.meta:  # keep a proxy that was set on purpose (sticky sessions)
            request.meta["proxy"] = next(self.pool)

Bagaimana menyesuaikan kelajuan dan percubaan semula?

CONCURRENT_REQUESTS_PER_DOMAIN adalah bilangan permintaan serentak yang boleh dihantar ke domain yang sama. Semakin banyak IP proksi, semakin tinggi nilai ini boleh dinaikkan tanpa meningkatkan beban pada setiap IP. Contohnya, dengan 500 IP dan 50 permintaan serentak, setiap IP hanya digunakan sekali setiap 10 permintaan secara purata.

Dengan mengaktifkan AUTOTHROTTLE, selang masa permintaan akan disesuaikan secara automatik mengikut kelajuan respons. Jika respons 429 meningkat, cuba semula dengan RETRY_HTTP_CODES, tetapi anda juga boleh memadamkan proksi dalam meta supaya middleware memasukkan proksi seterusnya semasa mencuba semula.

Dengan menambahkan langkah memeriksa sama ada hasil yang dikumpul adalah halaman sebenar dan bukan halaman pengesahan dalam saluran, kualiti data akan bertambah baik. Jika respons tidak mengandungi elemen yang diingini, anda boleh meminta semula dengan IP lain.

  • Sesuaikan bilangan permintaan serentak setiap domain mengikut bilangan IP
  • AUTOTHROTTLE untuk selang masa mengikut kelajuan respons
  • 429 dan 5xx: Cuba semula dengan IP lain
  • Pemeriksaan kandungan respons untuk menapis skrin pengesahan

Apa yang berbeza apabila menyambung dengan pengesahan IP?

Daftarkan IPv4 pelayan yang menjalankan Scrapy di papan pemuka, kemudian anda boleh menggunakan meta proxy seperti http://198.51.100.23:8000 tanpa nama pengguna dan kata laluan. Anda juga boleh memuat turun senarai dalam format=ip:port. Jika anda menjalankan labah-labah pada pelbagai pelayan, daftarkan semua IP pelayan tersebut. Anda boleh mendaftarkan sehingga 10 IP.

Bagaimana untuk mengikat permintaan yang memerlukan sesi dengan IP yang sama?

Untuk aliran yang memerlukan kesinambungan kuki seperti log masuk atau troli beli belah, anda perlu menggunakan IP yang sama. Masukkan meta proxy terus pada permintaan pertama, dan semasa membuat permintaan seterusnya dalam callback, teruskan nilai proxy dari response.meta tanpa diubah oleh middleware putaran. Menggunakan kunci meta cookiejar Scrapy juga memisahkan kuki mengikut sesi.

Jika anda memasangkan satu proksi dan satu set kuki untuk satu sesi, walaupun anda menjalankan banyak sesi serentak, mereka tidak akan bercampur.

import scrapy

PROXIES = [
    "http://spx_user:spx_pass@198.51.100.23:8000",
    "http://spx_user:spx_pass@198.51.100.24:8000",
]

class SessionSpider(scrapy.Spider):
    name = "sessions"

    def start_requests(self):
        for i, proxy in enumerate(PROXIES):
            yield scrapy.Request("https://example.com/", meta={"proxy": proxy, "cookiejar": i}, dont_filter=True)

    def parse(self, response):
        # follow-up request keeps the same proxy and the same cookie jar
        yield response.follow("/account", meta={"proxy": response.meta["proxy"], "cookiejar": response.meta["cookiejar"]}, callback=self.parse_account)

    def parse_account(self, response):
        self.logger.info("status %s via %s", response.status, response.meta["proxy"])

Bagaimana untuk mengeluarkan proksi yang gagal buat sementara waktu?

Jika middleware menerima respons 403 atau 429 dalam process_response, anda boleh berehatkan proksi tersebut selama beberapa minit dan menghantar semula permintaan yang sama dengan proksi lain. Salin permintaan, buang meta proxy, aktifkan dont_filter, dan kembalikan untuk proksi seterusnya mengambil alih.

Mengurus senarai proxy rehat dan masa penggunaan semula dengan kamus adalah mudah. Dengan tidak menggunakan IP yang sama semula dengan segera, anda memberi masa untuk had laman sasaran dikeluarkan.

Apakah yang perlu ditetapkan dalam Scrapy untuk menjimatkan bandwidth?

Scrapy secara lalai hanya menerima HTML, menggunakan bandwidth yang jauh lebih sedikit berbanding alat pelayar. Dengan HttpCompressionMiddleware yang diaktifkan secara lalai untuk menerima respons termampat, jumlah penghantaran dikurangkan lagi. Ini adalah sebab mengapa anda boleh mengumpul banyak halaman dalam had bandwidth bulanan pelan shared.

Untuk mengelakkan menerima halaman yang sama berulang kali, hidupkan HTTPCACHE_ENABLED semasa pembangunan supaya anda tidak perlu memanggil laman sasaran dan proxy semula setiap kali ujian. Dalam operasi, kekalkan penapisan alamat pendua (diaktifkan secara lalai) dan gunakan dont_filter hanya untuk permintaan yang benar-benar perlu diterima semula.

Penting juga untuk mengehadkan julat pautan yang diikuti untuk mengelakkan penyebaran ke halaman bawah tidak perlu. Menetapkan skop pengumpulan yang jelas mengurangkan masa, bandwidth dan beban laman sasaran.

Bagaimana cara menyelesaikan masalah yang sering terjadi?

Jika anda menerima respons 407, semula nama pengguna dan kata laluan dalam alamat. Jika kata laluan mengandungi aksara khas, anda perlu melakukan pengkodan peratus. TunnelError berlaku apabila proksi tidak menerima permintaan CONNECT, jadi pastikan port adalah port HTTP.

Jika semua permintaan keluar dari IP sama, middleware mungkin berada selepas HttpProxyMiddleware atau spider memasukkan meta proxy secara langsung. Semak susunan dalam settings.py dan kod spider.

Tetapan proxy Scrapy, meta proxy dan middleware putaran | Socks5Proxy