type
Post
status
Published
date
Oct 11, 2025
slug
akshare-proxy-config-guide
summary
本文从底层原理讲解如何为akshare这种量化交易工具配置代理,极易迁移到其他场景。
tags
推荐
工具
Doiiars
超级初学者
Python
category
知行合一
icon
password

一、akshare 的网络依赖

akshare 的核心网络库依赖:
关键问题:
  • requests 默认读取 HTTP_PROXY 环境变量 ✓
  • aiohttp 默认 不读取 环境变量 ✗
这导致仅设置环境变量,akshare 的异步接口可能无法走代理。

二、分步配置策略

2.1 针对 requests 部分(环境变量即可)

akshare 中使用 requests 的接口,只需设置环境变量:
Windows 系统设置环境变量:
Linux/Mac 系统:
验证是否生效:

2.2 针对 aiohttp 部分(需要额外配置)

如果 akshare 的某些接口使用了 aiohttp,仅设置环境变量不够,需要以下方案。

三、完整解决方案

方案 1:Monkey-patch aiohttp(最简单)

原理: 在导入 akshare 前,修改 aiohttp 的默认行为。
优点: 5 行代码,无需修改源码,对 requests 和 aiohttp 都生效。

方案 2:PySocks 全局代理

原理: 直接代理 Python 的 socket 层,所有网络库自动生效。
安装: pip install PySocks
优点: 最底层方案,对所有网络库生效。

方案 3:系统级代理工具

Linux/Mac: proxychains

Windows: Proxifier

图形化工具,设置规则后所有程序自动走代理。
优点: 无需改代码,适合频繁切换代理。

三、网络原理深入

3.1 网络请求的层次结构

代理可以在任一层实现:
层次
方案
优点
缺点
应用层
修改 akshare 源码
精确控制
需要维护代码
HTTP 库层
环境变量 + trust_env
标准做法
aiohttp 需要额外设置
Socket 层
PySocks
全局生效
可能影响其他程序
系统层
proxychains / Proxifier
透明代理
依赖外部工具

3.2 为什么 aiohttp 默认不信任环境变量?

历史原因: aiohttp 设计之初,trust_env=False 是为了:
  1. 避免意外的代理行为
  1. 更明确的配置方式
  1. 安全考虑(防止环境变量污染)
但这与 requestshttpx 等库的默认行为不一致,导致用户困惑。
社区讨论: aiohttp issue #10682 建议修改默认值为 True,但尚未合并。

3.3 Socket 层代理的工作原理

关键优势: 在最底层拦截,对上层透明,无需修改任何代码。

四、方案选择建议

决策流程

  1. 先测试环境变量(针对 requests)
      • 如果 akshare 接口都能正常工作 → 完成 ✓
      • 如果部分接口超时 → 说明用了 aiohttp,继续下一步
  1. 选择 aiohttp 代理方案
场景
推荐方案
快速测试
方案 1(Monkey-patch)
生产环境
方案 2(PySocks)
本地开发
方案 3(系统工具)
Docker 部署
环境变量 + Monkey-patch
多项目共用
系统级代理

五、验证代理是否生效


总结

  1. 分步配置:
      • requests 部分:设置环境变量即可
      • aiohttp 部分:需要额外配置
  1. 最简方案: 先测试环境变量,不够再 Monkey-patch
  1. 最彻底方案: PySocks 代理 socket 层,一劳永逸
  1. 原理: 代理可以在网络栈的任一层实现
先简单后复杂,能用环境变量就不用写代码。
Doiiars STOCK MCP 配置及工具推荐提示词基于 UV 的 Python 版本管理
Loading...