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环境变量),然后自动应用到所有请求上。
如果你需要更精细的控制,比如只对特定域名使用代理,可以在中间件里添加判断逻辑。
总结:用中间件自动获取系统代理设置最方便。
但是命令行中其他命令并不会走代理啊
两边都是访问的同一个地址吗? 是不是你的代理有做条件切换呢?
我代理是全局的
抓下包

