You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy项目代理配置遇407未授权错误求助

解决Scrapy代理配置出现407 Unauthorized错误的问题

从你给出的错误日志Could not open CONNECT tunnel with proxy x.x.x.x:xxxx [{'status': 407, 'reason': b'Unauthorized'}]能直接定位问题:你的代理服务器要求身份验证,但当前配置只提供了代理地址,没有附带用户名和密码信息。

下面是具体的解决方法:

1. 直接在代理地址中嵌入认证信息

最简单的方式是把代理的用户名和密码直接加到代理URL里,格式为http://用户名:密码@代理IP:端口,修改你的代理池代码:

self.proxy_pool = ['http://your_username:your_password@x.x.x.x:xxxx']

这样Scrapy在发起请求时会自动将认证信息发送给代理服务器,就能解决407未授权的问题。

2. 更安全的方式:避免硬编码敏感信息

如果不想把用户名、密码直接写在代码里,可以通过环境变量或Scrapy配置文件来读取:

  • 先在项目的settings.py中添加配置(借助环境变量传递敏感信息):
import os

PROXY_USERNAME = os.getenv('PROXY_USER')
PROXY_PASSWORD = os.getenv('PROXY_PASS')
PROXY_IP_PORT = 'x.x.x.x:xxxx'
  • 然后在爬虫代码中拼接代理地址:
from scrapy.utils.project import get_project_settings

def __init__(self, *args, **kwargs):
    super(FirstSpyder, self).__init__(*args, **kwargs)
    settings = get_project_settings()
    proxy_auth_str = f"{settings.get('PROXY_USERNAME')}:{settings.get('PROXY_PASSWORD')}"
    self.proxy_pool = [f"http://{proxy_auth_str}@{settings.get('PROXY_IP_PORT')}"]

这种方式可以避免代码泄露敏感数据,你只需要在运行爬虫前设置好对应的环境变量即可。

3. 额外的检查要点

  • 确认代理的用户名、密码没有拼写错误,也没有过期失效
  • 先用curl命令测试代理是否可用:curl -x http://username:password@x.x.x.x:xxxx https://www.myip.com/
  • 如果使用的是HTTPS代理,确保你的Scrapy版本支持,且代理服务器的HTTPS配置正常

修改后的完整爬虫代码示例(直接嵌入认证信息版本):

import random
from scrapy import Request
from scrapy.spiders import CrawlSpider

class FirstSpyder(CrawlSpider):
    name = "FirstSpyder"
    allowed_domains = ["myip.com"]
    start_urls = ['https://www.myip.com/']

    def __init__(self, *args, **kwargs):
        super(FirstSpyder, self).__init__(*args, **kwargs)
        # 替换为你的带认证的代理地址
        self.proxy_pool = ['http://your_username:your_password@x.x.x.x:xxxx']

    def start_requests(self):
        for url in self.start_urls:
            request = Request(url, dont_filter=True, callback=self.parse)
            request.meta['proxy'] = random.choice(self.proxy_pool)
            yield request

    def parse(self, response):
        ip = response.css('#ip::text').get()
        print("IPV4::", ip)

内容的提问来源于stack exchange,提问作者Suresh K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:21:04