Skip to content
advanced

Web Scraping Tingkat Lanjut dengan Dataimpulse Rotating Residential Proxies dan Scrapy di Linux

Bangun spider Scrapy yang siap produksi yang merotasi proxy residensial Dataimpulse, menangani percobaan ulang, dan melakukan penskalaan di Linux.

Linux SOCKS5 HTTP(S) Web Scraping

Gambaran Umum

Scrapy adalah framework Python yang kuat untuk web scraping skala besar. Tutorial ini menunjukkan cara mengintegrasikan proxy residensial rotating Dataimpulse ke dalam proyek Scrapy di Linux, dengan middleware kustom untuk rotasi, logika percobaan ulang, dan dukungan SOCKS5. Kami juga akan membahas penskalaan dengan beberapa spider.

Prasyarat

  • Server Linux (disarankan Ubuntu 20.04+)
  • Python 3.8+
  • Scrapy terinstal (pip install scrapy)
  • Kredensial proxy residensial Dataimpulse (HTTP atau SOCKS5)
  • Pengetahuan dasar tentang middleware dan pengaturan Scrapy

Arsitektur

Kami akan menggunakan middleware downloader kustom untuk merotasi proxy per permintaan. Dataimpulse menyediakan endpoint rotating (satu host:port yang merotasi IP secara otomatis) atau daftar endpoint sticky session. Periksa dasbor Dataimpulse Anda untuk format endpoint yang tepat.

Langkah-langkah

  1. Siapkan proyek Scrapy.

    pip install scrapy
    scrapy startproject advanced_scraper
    cd advanced_scraper
    
  2. Simpan kredensial proxy Anda dengan aman. Buat file .env (dan tambahkan ke .gitignore) atau ekspor variabel lingkungan:

    export DAI_PROXY_HOST="your-proxy-host"
    export DAI_PROXY_PORT="your-proxy-port"
    export DAI_PROXY_USER="your-username"
    export DAI_PROXY_PASS="your-password"
    
  3. Buat middleware proxy kustom. Di advanced_scraper/middlewares.py, tambahkan:

    import os
    from scrapy import signals
    from scrapy.exceptions import NotConfigured
    
    class DataimpulseProxyMiddleware:
        def __init__(self, proxy_url):
            self.proxy_url = proxy_url
    
        @classmethod
        def from_crawler(cls, crawler):
            proxy_host = os.getenv('DAI_PROXY_HOST')
            proxy_port = os.getenv('DAI_PROXY_PORT')
            proxy_user = os.getenv('DAI_PROXY_USER')
            proxy_pass = os.getenv('DAI_PROXY_PASS')
    
            if not all([proxy_host, proxy_port, proxy_user, proxy_pass]):
                raise NotConfigured('Kredensial proxy Dataimpulse tidak ada')
    
            proxy_url = f'socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
            return cls(proxy_url)
    
        def process_request(self, request, spider):
            request.meta['proxy'] = self.proxy_url
            # Untuk SOCKS5, Scrapy memerlukan skema proxy di meta
            # Tidak ada header tambahan yang diperlukan untuk SOCKS5
    
  4. Aktifkan middleware dan konfigurasikan pengaturan Scrapy. Di advanced_scraper/settings.py, perbarui:

    DOWNLOADER_MIDDLEWARES = {
        'advanced_scraper.middlewares.DataimpulseProxyMiddleware': 543,
        # Nonaktifkan middleware proxy bawaan jika diaktifkan
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    }
    
    # Pengaturan percobaan ulang
    RETRY_ENABLED = True
    RETRY_TIMES = 5
    RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429]
    
    # Konkurensi dan jeda
    CONCURRENT_REQUESTS = 16
    DOWNLOAD_DELAY = 0.5
    
  5. Buat spider yang menggunakan middleware. Di advanced_scraper/spiders/example.py:

    import scrapy
    
    class ExampleSpider(scrapy.Spider):
        name = 'example'
        start_urls = ['https://httpbin.org/ip']
    
        def parse(self, response):
            yield {'ip': response.json()['origin']}
    

    Jalankan:

    scrapy crawl example
    

    Outputnya harus menunjukkan IP Dataimpulse.

  6. Implementasikan rotasi proxy untuk sticky session (opsional). Jika Anda memiliki beberapa endpoint sticky session, ubah middleware untuk memilih proxy acak dari daftar:

    import random
    
    class RotatingProxyMiddleware:
        def __init__(self, proxy_list):
            self.proxy_list = proxy_list
    
        @classmethod
        def from_crawler(cls, crawler):
            # Bangun daftar dari environment atau konfigurasi
            proxy_list = [
                f'socks5://{os.getenv("DAI_PROXY_USER")}:{os.getenv("DAI_PROXY_PASS")}@{host}:{port}'
                for host, port in [('host1', 'port1'), ('host2', 'port2')]
            ]
            return cls(proxy_list)
    
        def process_request(self, request, spider):
            request.meta['proxy'] = random.choice(self.proxy_list)
    
  7. Skalakan dengan beberapa spider menggunakan scrapyd. Instal scrapyd:

    pip install scrapyd scrapyd-client
    

    Deploy proyek Anda dan jadwalkan beberapa spider dengan endpoint proxy yang berbeda. Gunakan antrean pekerjaan untuk mendistribusikan URL.

  8. Pantau dan tangani kesalahan. Catat kegagalan proxy di middleware:

    def process_response(self, request, response, spider):
        if response.status in [403, 429]:
            spider.logger.warning(f'Diblokir dengan proxy {request.meta.get("proxy")}')
        return response
    

Pemecahan Masalah

  • SOCKS5 tidak berfungsi: Pastikan Anda menggunakan skema socks5:// di request.meta['proxy'] dan middleware HttpProxyMiddleware milik Scrapy dinonaktifkan. Scrapy bergantung pada txsocksx atau PySocks; instal pip install txsocksx jika diperlukan.
  • Kesalahan autentikasi: Enkode URL karakter khusus di username/password.
  • Tingkat ban tinggi: Tingkatkan jeda, kurangi konkurensi, dan pastikan Anda menggunakan endpoint rotating. Pertimbangkan menggunakan sticky session Dataimpulse untuk situs yang memerlukan login.
  • Kebocoran memori: Pantau penggunaan memori Scrapy dengan scrapy stats dan mulai ulang spider secara berkala.

Ringkasan

Mengintegrasikan proxy residensial rotating Dataimpulse dengan Scrapy di Linux melibatkan middleware downloader kustom, pengaturan percobaan ulang yang tepat, dan opsional SOCKS5 untuk fleksibilitas protokol. Dengan melakukan penskalaan menggunakan scrapyd dan memantau performa proxy, Anda dapat membangun pipeline scraping yang tangguh. Selalu patuhi ketentuan layanan dan robots.txt situs web target.