Scrapy项目代理配置遇407未授权错误求助
从你给出的错误日志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
相关产品推荐
相关产品推荐

