Skip to content
Intermediate / 2 min read

如何在 Python 中使用 Scrapy 配合 ProxyScrape 住宅代理

将 ProxyScrape 住宅代理集成到你的 Scrapy 爬虫中,以实现可靠的 Python 网页抓取。包括轮换中间件、身份验证和 SOCKS5 设置。

SOCKS5 HTTP(S) 网页抓取

概述

Scrapy 是一个强大的 Python 网页抓取框架,但许多网站会阻止来自单个 IP 的请求。使用 ProxyScrape 的代理有助于分散请求、避免速率限制并访问受地理限制的内容。ProxyScrape 提供住宅、数据中心和移动代理,支持 HTTP 和 SOCKS5,可按需付费或按月固定计费,并拥有 9700 万+ IP 池,专为长期稳定运行而构建。

本教程向你展示如何将 ProxyScrape 代理集成到 Scrapy 项目中。你将学习配置身份验证、按请求轮换代理以及处理常见错误。该方法适用于 Windows、macOS 和 Linux。

前置条件

  • 已安装 Python 3.8 或更高版本。
  • 已安装 Scrapy(pip install scrapy)。
  • 拥有一个带有住宅或数据中心代理的 ProxyScrape 账户。你可以注册套餐或使用按需付费。
  • 你的代理凭据:来自 ProxyScrape 仪表板的主机、端口、用户名和密码。

理解 Scrapy 中的代理身份验证

ProxyScrape 使用用户名/密码身份验证。在 Scrapy 中,你通过请求的 proxy meta 键传入代理 URL。格式为:

  • HTTP/HTTPS:http://username:password@host:port
  • SOCKS5:socks5://username:password@host:port

Scrapy 原生支持 HTTP 和 HTTPS 代理。对于 SOCKS5,你需要额外的包,例如 scrapy-socks。

第 1 步:安装 Scrapy 并创建项目

打开终端并运行:

pip install scrapy
scrapy startproject proxyscrape_scrapy
cd proxyscrape_scrapy

这会创建一个新的 Scrapy 项目,带有默认的爬虫目录。

第 2 步:从 ProxyScrape 获取代理凭据

登录你的 ProxyScrape 仪表板并创建代理列表。你将获得主机、端口、用户名和密码。对于住宅代理,你可能会获得一个自动轮换的网关主机,或一组端点。对于数据中心代理,你通常会获得固定的 IP 和端口。

示例凭据:

  • 主机:proxy.proxyscrape.com
  • 端口:8080
  • 用户名:user123
  • 密码:pass456

你的代理 URL 变为:http://user123:[email protected]:8080

如果你的密码包含特殊字符,请对其进行 URL 编码(例如,@ 变为 %40)。

第 3 步:在爬虫中配置基本代理

创建一个简单的爬虫,通过代理检查你的 IP 地址。在 proxyscrape_scrapy/spiders/example.py 中:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['https://httpbin.org/ip']

    def start_requests(self):
        proxy = 'http://user123:[email protected]:8080'
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={'proxy': proxy},
                callback=self.parse
            )

    def parse(self, response):
        yield {'ip': response.text}

运行爬虫:

scrapy crawl example -O output.json

输出显示目标站点看到的 IP 地址。如果它与你的代理 IP 匹配,则设置有效。

第 4 步:实现轮换代理中间件

按请求轮换代理可提高匿名性并降低被封禁的几率。在 proxyscrape_scrapy/middlewares.py 中创建中间件:

import random
from scrapy import signals

class ProxyRotationMiddleware:
    def __init__(self, proxies):
        self.proxies = proxies

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('PROXY_LIST'))

    def process_request(self, request, spider):
        proxy = random.choice(self.proxies)
        request.meta['proxy'] = proxy
        spider.logger.debug(f'Using proxy: {proxy}')

在 settings.py 中启用中间件并定义你的代理列表:

DOWNLOADER_MIDDLEWARES = {
    'proxyscrape_scrapy.middlewares.ProxyRotationMiddleware': 543,
}

PROXY_LIST = [
    'http://user1:pass1@host1:port1',
    'http://user2:pass2@host2:port2',
    'http://user3:pass3@host3:port3',
]

现在每个请求都会使用列表中的随机代理。你可以用多个 ProxyScrape 端点填充该列表,或使用他们的轮换网关(一个自动轮换的端点)。

第 5 步:处理 SOCKS5 代理(可选)

Scrapy 原生不支持 SOCKS5。安装 scrapy-socks:

pip install scrapy-socks

将 SOCKS5 中间件添加到 settings.py:

DOWNLOADER_MIDDLEWARES = {
    'scrapy_socks.Socks5DownloaderMiddleware': 543,
}

然后在请求 meta 中将代理设置为 socks5://user:pass@host:port。请注意,如果没有自定义逻辑,你不能同时使用轮换中间件和 scrapy-socks。对于大多数用例,HTTP 代理更简单且足够。

第 6 步:测试并验证轮换

运行你的爬虫并检查输出:

scrapy crawl example -O output.json

检查 output.json。如果你在请求之间看到不同的 IP 地址,说明轮换正在工作。你还可以在请求之间添加延迟以保持礼貌:

DOWNLOAD_DELAY = 2

故障排除

  • 407 Proxy Authentication Required:检查你的用户名和密码。确保它们已进行 URL 编码。验证你的 ProxyScrape 套餐是否有效。
  • 连接被拒绝或超时:确认主机和端口。检查你的防火墙或 VPN。尝试不同的代理端点。
  • 频繁被封禁:切换到住宅代理,增加 DOWNLOAD_DELAY,并启用轮换。数据中心代理在严格站点上更可能被封禁。
  • SOCKS5 错误:确保已安装并配置 scrapy-socks。如果出现导入错误,请重新安装该包。
  • SSL 错误:如果目标站点需要,添加 DOWNLOAD_HANDLERS 或在代理 URL 中使用 https。

为 Scrapy 选择合适的代理类型

代理类型 最适合 说明
住宅 抓取具有反机器人保护的网站 高匿名性、大 IP 池、速度较慢
数据中心 高速抓取保护较少的网站 更快、更便宜、更容易被封禁
移动 抓取移动端特定内容或应用 很少被封禁、成本更高

ProxyScrape 提供所有三种类型,并采用灵活计费。对于大多数抓取任务,从住宅代理开始。

总结

你已经学习了如何将 ProxyScrape 代理集成到 Scrapy 中:安装 Scrapy、获取凭据、配置基本代理、构建轮换中间件,以及可选地使用 SOCKS5。测试你的设置并调整轮换和延迟以避免被封禁。ProxyScrape 可靠的住宅和数据中心代理拥有 9700 万+ IP 和长期稳定运行,使其成为 Python 抓取项目的可靠选择。