Mac 系统下,Python的Scrapy框架如何自动走系统代理?

我在系统自带的终端下,执行 scrapy crawl xxxx 发现,会自动走配置在 Mac 系统中的代理

我可以确认 Terminal.app 这个终端没有配置代理 export 中看不到 http_proxy https_proxy

想问问这是怎么回事
Mac 系统下,Python的Scrapy框架如何自动走系统代理?

6 回复

你的系统代理设置的是全局的吧?


在Mac下让Scrapy走系统代理,最简单的方式是配置Request.meta['proxy']参数。不过更推荐使用中间件自动处理,这样所有请求都会自动走代理。

这里给你一个完整的中间件实现:

# middlewares.py
import os
from scrapy import signals
from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
from urllib.request import getproxies

class SystemProxyMiddleware(HttpProxyMiddleware):
    """自动使用系统代理的中间件"""
    
    def __init__(self, auth_encoding='latin-1'):
        super().__init__(auth_encoding)
        # 获取系统代理设置
        self.system_proxies = getproxies()
    
    @classmethod
    def from_crawler(cls, crawler):
        middleware = cls()
        crawler.signals.connect(middleware.spider_opened, signal=signals.spider_opened)
        return middleware
    
    def process_request(self, request, spider):
        # 如果请求已经设置了代理,就不覆盖
        if 'proxy' in request.meta:
            return
        
        # 从系统代理中获取对应的协议代理
        url = request.url
        if url.startswith('http://') and 'http' in self.system_proxies:
            request.meta['proxy'] = self.system_proxies['http']
        elif url.startswith('https://') and 'https' in self.system_proxies:
            request.meta['proxy'] = self.system_proxies['https']

然后在settings.py中启用这个中间件:

# settings.py
DOWNLOADER_MIDDLEWARES = {
    'your_project_name.middlewares.SystemProxyMiddleware': 100,
    # 禁用Scrapy默认的代理中间件,避免冲突
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
}

这个中间件会通过urllib.request.getproxies()获取Mac的系统代理设置(包括网络设置和http_proxy环境变量),然后自动应用到所有请求上。

如果你需要更精细的控制,比如只对特定域名使用代理,可以在中间件里添加判断逻辑。

总结:用中间件自动获取系统代理设置最方便。

但是命令行中其他命令并不会走代理啊

两边都是访问的同一个地址吗? 是不是你的代理有做条件切换呢?

我代理是全局的

抓下包

回到顶部