跳到正文

Scrapy 代理设置:请求 meta、中间件和环境变量

Scrapy 内置了代理中间件,所以可以按单个请求、为整个爬虫或通过环境变量设置代理。本文给出每种方式、让抓取保持克制的设置,以及怎么确认代理已被使用。

proxy meta 键

Scrapy 文档把 HttpProxyMiddleware 描述为这样的组件:它通过 Request 对象的 proxy meta 值,为请求设置 HTTP 代理。你可以自己设置这个键,值形如 http://some_proxy_server:port 或 http://username:password@some_proxy_server:port。文档还补充说,单个请求上的值优先于环境变量,并且会忽略 no_proxy。

proxy meta 键:示例

import scrapy

class IpSpider(scrapy.Spider):
    name = "ip"

    async def start(self):
        yield scrapy.Request(
            "https://ipinfo.io/json",
            meta={"proxy": "http://USERNAME:PASSWORD@proxy-host:port"},
        )

    def parse(self, response):
        yield response.json()

请把 USERNAME、PASSWORD、proxy-host 和 port 换成你的代理的值。start() 方法遵循当前的 Scrapy 文档(2.19.0);如果你用的版本较旧,请对照该版本的文档。

给每个请求用同一个代理

为了不用重复写 meta 键,可以在下载中间件里设置它。文档说明,下载中间件通过 DOWNLOADER_MIDDLEWARES 设置来启用,其中每个类路径都有一个顺序号,并且每个经过它的请求都会调用 process_request()。

给每个请求用同一个代理:示例

# myproject/middlewares.py
class ProxyMiddleware:
    def process_request(self, request):
        request.meta.setdefault("proxy", "http://USERNAME:PASSWORD@proxy-host:port")
        return None

仅为示例:请把占位内容换成你自己的值。

给每个请求用同一个代理:示例

# settings.py
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.ProxyMiddleware": 543,
}

账号密码请从环境变量或密钥文件读取,不要直接写在代码里。请对照你所用 Scrapy 版本的文档,确认 process_request() 的签名。

环境变量

HttpProxyMiddleware 和 Python 的 urllib.request 一样,遵循 http_proxy、https_proxy 和 no_proxy 环境变量。在开始抓取前设置好它们,就不需要改爬虫代码。

环境变量:示例

export http_proxy="http://USERNAME:PASSWORD@proxy-host:port"
export https_proxy="http://USERNAME:PASSWORD@proxy-host:port"
scrapy crawl ip

密码中的 @、: 和 / 等字符在代理 URL 里必须做百分号编码。见[代理地址、端口和登录指南](/zh/guides/proxy-address-port-login/)。

HTTP 还是 SOCKS

Scrapy 文档说明,像 socks5://username:password@some_proxy_server:port 这样的 SOCKS 代理 URL,只有在下载处理器支持时才能使用;文档指出,内置处理器中基于 httpx 的那个支持,其他内置处理器不支持。同一页还提到,代理 URL 通常使用 http:// 方案。对默认的 Scrapy 项目,请使用 HTTP 代理。如果需要 SOCKS5,先确认你用的是哪个下载处理器,并阅读该处理器的文档。

检查代理是否生效

运行上面的爬虫,读取 https://ipinfo.io/json 响应里的 country 和 org 字段;代理位置检查指南解释了怎么读它们。如果看到的是你自己的地址,说明这个请求上没有设置 meta 键,或者环境变量是在抓取开始之后才设置的。请加上中间件,让每个请求都带有这个键。

让抓取保持克制

代理会改变网站看到的地址,但网站的规则仍然适用。Scrapy 有相应的设置。设置文档说明,ROBOTSTXT_OBEY 让 Scrapy 遵守 robots.txt 策略,并且在 scrapy startproject 命令生成的 settings.py 中是开启的。DOWNLOAD_DELAY 设置对同一域名的两个连续请求之间的最短秒数,目的是避免给服务器造成过大压力;CONCURRENT_REQUESTS_PER_DOMAIN 限制对一个域名的同时请求数。AutoThrottle 扩展根据下载延迟动态调整间隔,以达到对每个远程站点的目标并发数。抓取目标网站前,请先阅读它的条款。

让抓取保持克制:示例

# settings.py
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 1
CONCURRENT_REQUESTS_PER_DOMAIN = 2
AUTOTHROTTLE_ENABLED = True

这些数值只是起点;请选择适合目标网站和你任务的数字。

常见错误

407 状态码表示代理没有接受账号密码:请重新复制并检查编码,然后见代理认证失败指南。连接错误和超时通常意味着主机、端口或方案写错了;代理连接失败指南列出了检查项。文档把 RetryMiddleware 描述为会重试因临时原因失败的请求,例如连接超时或 HTTP 500 错误,所以日志里出现少量失败并不总是代理的问题。如果你用普通 HTTP 调用而不是 Scrapy 来收集页面,见 Python requests 指南。

用 Proxy302 怎么做

上面任何一种设置,只需要 Proxy302 代理的地址、端口、账号和密码。动态住宅按流量(GB)计费,出口国家在生成代理时设置;HTTP 在 proxy.proxy302.com 的 2222 端口。静态 ISP IP 在整个租期内固定,不轮换。下表是我们最近一次每小时检测时 7 个国家的出口;探测器请求的是 ChatGPT,它只是一个示例目标。详情见动态住宅页面和代理位置检查指南。

实测出口:ChatGPT 从 7 个国家的连通

实测出口:ChatGPT 从 7 个国家的连通
项目城市运营商网络ASN
美国Baton Rouge, LouisianaVerizon BusinessAS6167
英国Birkenhead, EnglandVirgin Media LimitedAS5089
德国Hannover, Lower Saxonyhtp GmbHAS13045
日本Saitama, SaitamaJCOM Co., Ltd.AS9824
新加坡Yishun New Town, SingaporeSingtel Fibre BroadbandAS9506
巴西Silvianópolis, Minas Geraisintertel telecomunicacao LTDAAS268801
印度尼西亚Jakarta, JakartaPT Mahawira Nusantara GrupAS151576

Proxy302 探测器每小时检测一次,本次检测时间:2026 年 10 月 28 日 14:56 UTC。每个国家通过一个动态住宅出口、经公开的 Proxy302 入口向 ChatGPT 发一次请求。IP 只公开前三段。每国一个样本,不是平均值,之后的检测结果会不同。

用 Proxy302 怎么做:步骤

  1. 第 1 步

    打开动态住宅页面,选择线路,「协议」保持 HTTP 或改选 SOCKS5,然后点击「确认费用并生成」。

  2. 第 2 步

    打开「我的资产」(控制台里放着你买到的全部代理),复制 HOST(地址)、PORT(端口)、USERNAME(账号)和 PASSWORD(密码)。「连接工具」页(控制台里教你把代理接到各种软件的页面)里有填好你自己连接信息的现成示例。

  3. 第 3 步

    把这些信息填入你正在设置的浏览器或软件。

  4. 第 4 步

    通过代理访问 https://ipinfo.io/json 确认出口。

  5. 第 5 步

    在中国大陆,先在「连接工具」页打开辅助工具,使用代理期间保持开着。

价格与限制

低价线路每 GB 收费 US$1.50,100 GB 套餐每 GB US$1.35,300 GB 每 GB US$1.20。不提供免费试用,最小购买单位为 1 GB。可用的出口位置每天都会变化。

常见问题

Scrapy 接受哪种代理 URL 格式?

文档给出的示例是 http://some_proxy_server:port 和 http://username:password@some_proxy_server:port。

Scrapy 支持 SOCKS5 代理吗?

文档说明,SOCKS 代理 URL 只有在下载处理器支持时才有效,并列出基于 httpx 的处理器是支持它的内置处理器。

meta 里的 proxy 值会遵守 no_proxy 吗?

不会。文档说明,单个请求上的 proxy meta 值优先于环境变量,并且会忽略 no_proxy。

使用代理会让 Scrapy 忽略 robots.txt 吗?

不会。ROBOTSTXT_OBEY 是 Scrapy 的另一项设置,代理不会改变它。

参考资料

6
  1. Scrapy 文档:下载中间件,HttpProxyMiddleware 和 RetryMiddleware

    官方文档 · 确认日期:

    2026 年 10 月 28 日读取(文档版本 2.19.0):proxy meta 键,http_proxy/https_proxy/no_proxy,带账号密码的 URL 格式,meta 值的优先级,SOCKS 取决于下载处理器,DOWNLOADER_MIDDLEWARES 和 process_request(),以及 RetryMiddleware。

  2. Scrapy 文档:请求和响应

    官方文档 · 确认日期:

    2026 年 10 月 28 日读取:Request 的 meta 字典,proxy meta 键,以及爬虫的异步 start() 方法。

  3. Scrapy 文档:设置

    官方文档 · 确认日期:

    2026 年 10 月 28 日读取:ROBOTSTXT_OBEY(在 startproject 创建的 settings.py 中开启)、DOWNLOAD_DELAY 和 CONCURRENT_REQUESTS_PER_DOMAIN。

  4. Scrapy 文档:AutoThrottle 扩展

    官方文档 · 确认日期:

    2026 年 10 月 28 日读取:该扩展根据下载延迟动态调整间隔,以达到每个远程站点的 AUTOTHROTTLE_TARGET_CONCURRENCY。

  5. Proxy302 产品事实与价格表

    产品观察 · 确认日期:

    站点的产品事实表(数值已于 2026 年 10 月 18-19 日对照控制台、后端和价格表核对):产品、美元价格(1 PTC = 1 美元)、租期、协议与端口、国家数、数量上限、没有免费试用。

  6. Proxy302 每小时连通检测

    产品观察 · 确认日期:

    探测器的公开 JSON proxy302.com/live/connectivity/chatgpt.json,读取于 2026 年 10 月 28 日 14:56 UTC:每个出口国家一次请求,经动态住宅出口;出口城市、ASN、网络和响应时间。

准备好试试了吗?

注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。