Skip to content
advanced

在 Linux 上使用 Dataimpulse 轮换住宅代理与 Scrapy 进行高级网页抓取

构建一个可用于生产环境的 Scrapy 爬虫,能够轮换 Dataimpulse 住宅代理、处理重试,并在 Linux 上扩展。

Linux SOCKS5 HTTP(S) 网页抓取

概述

Scrapy 是一个用于大规模网页抓取的强大 Python 框架。本教程演示如何在 Linux 上的 Scrapy 项目中集成 Dataimpulse 轮换住宅代理,包括用于轮换、重试逻辑和 SOCKS5 支持的自定义中间件。我们还将介绍如何使用多个爬虫进行扩展。

前提条件

  • Linux 服务器(推荐 Ubuntu 20.04+)
  • Python 3.8+
  • 已安装 Scrapy(pip install scrapy)
  • Dataimpulse 住宅代理凭据(HTTP 或 SOCKS5)
  • 基本了解 Scrapy 中间件和设置

架构

我们将使用自定义下载器中间件来为每个请求轮换代理。Dataimpulse 提供轮换端点(一个自动轮换 IP 的单个 host:port)或一组粘性会话端点。请查看您的 Dataimpulse 仪表板以获取确切的端点格式。

步骤

  1. 设置 Scrapy 项目。

    pip install scrapy
    scrapy startproject advanced_scraper
    cd advanced_scraper
    
  2. 安全存储您的代理凭据。 创建 .env 文件(并将其添加到 .gitignore)或导出环境变量:

    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. 创建自定义代理中间件。 在 advanced_scraper/middlewares.py 中,添加:

    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('Dataimpulse proxy credentials missing')
    
            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
            # 对于 SOCKS5,Scrapy 要求在 meta 中提供代理 scheme
            # SOCKS5 不需要额外的 headers
    
  4. 启用中间件并配置 Scrapy 设置。 在 advanced_scraper/settings.py 中,更新:

    DOWNLOADER_MIDDLEWARES = {
        'advanced_scraper.middlewares.DataimpulseProxyMiddleware': 543,
        # 如果启用了默认代理中间件,则将其禁用
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    }
    
    # 重试设置
    RETRY_ENABLED = True
    RETRY_TIMES = 5
    RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408, 429]
    
    # 并发和延迟
    CONCURRENT_REQUESTS = 16
    DOWNLOAD_DELAY = 0.5
    
  5. 创建一个使用该中间件的爬虫。 在 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']}
    

    运行它:

    scrapy crawl example
    

    输出应显示一个 Dataimpulse IP。

  6. 为粘性会话实现代理轮换(可选)。 如果您有多个粘性会话端点,请修改中间件以从列表中随机选择一个代理:

    import random
    
    class RotatingProxyMiddleware:
        def __init__(self, proxy_list):
            self.proxy_list = proxy_list
    
        @classmethod
        def from_crawler(cls, crawler):
            # 从环境变量或配置构建列表
            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. 使用 scrapyd 通过多个爬虫进行扩展。 安装 scrapyd:

    pip install scrapyd scrapyd-client
    

    部署您的项目,并使用不同的代理端点调度多个爬虫。使用作业队列分发 URL。

  8. 监控并处理错误。 在中间件中记录代理失败:

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

故障排除

  • SOCKS5 无法工作:确保在 request.meta['proxy'] 中使用 socks5:// scheme,并且 Scrapy 的 HttpProxyMiddleware 已禁用。Scrapy 依赖 txsocksx 或 PySocks;如果需要,请安装 pip install txsocksx。
  • 认证错误:对用户名/密码中的特殊字符进行 URL 编码。
  • 高封禁率:增加延迟、降低并发,并确保您使用的是轮换端点。对于需要登录的网站,考虑使用 Dataimpulse 的粘性会话。
  • 内存泄漏:使用 scrapy stats 监控 Scrapy 的内存使用情况,并定期重启爬虫。

总结

在 Linux 上将 Dataimpulse 轮换住宅代理与 Scrapy 集成涉及自定义下载器中间件、正确的重试设置,以及可选的 SOCKS5 以提供协议灵活性。通过使用 scrapyd 进行扩展并监控代理性能,您可以构建一个稳健的抓取管道。始终尊重目标网站的服务条款和 robots.txt。