在 Linux 上使用 Dataimpulse 轮换住宅代理与 Scrapy 进行高级网页抓取
构建一个可用于生产环境的 Scrapy 爬虫,能够轮换 Dataimpulse 住宅代理、处理重试,并在 Linux 上扩展。
概述
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 仪表板以获取确切的端点格式。
步骤
-
设置 Scrapy 项目。
pip install scrapy scrapy startproject advanced_scraper cd advanced_scraper -
安全存储您的代理凭据。 创建
.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" -
创建自定义代理中间件。 在
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 -
启用中间件并配置 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 -
创建一个使用该中间件的爬虫。 在
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。
-
为粘性会话实现代理轮换(可选)。 如果您有多个粘性会话端点,请修改中间件以从列表中随机选择一个代理:
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) -
使用 scrapyd 通过多个爬虫进行扩展。 安装 scrapyd:
pip install scrapyd scrapyd-client部署您的项目,并使用不同的代理端点调度多个爬虫。使用作业队列分发 URL。
-
监控并处理错误。 在中间件中记录代理失败:
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。