VSCode中requests报403主因是未设置User-Agent,需手动添加;代理配置需区分环境变量与proxies参数,aiohttp不读环境变量须显式配置connector。

VSCode 里 requests 报 403?检查 User-Agent 是不是空的
requests 默认不带 User-Agent,多数网站直接返回 403。这不是 VSCode 的问题,而是代码没显式设置请求头导致的。
常见错误写法:requests.get("https://example.com") —— 没传 headers,服务器一眼认出是爬虫。
实操建议:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 必须手动构造
headers字典,"User-Agent"键名大小写敏感,值推荐用主流浏览器字符串(如 Chrome 最新版) - 别硬编码在每次请求里,封装成常量或函数参数更可控
- 如果用了
BeautifulSoup解析,User-Agent仍由requests负责传递,BS4 不参与网络层 - 验证是否生效:打印
response.request.headers,确认User-Agent出现在输出中
代理只对插件生效?HTTP_PROXY 和 HTTPS_PROXY 环境变量要分清作用域
VSCode 自身更新、插件安装走的是 Electron 主进程,它读取系统级 HTTP_PROXY/HTTPS_PROXY;但你写的爬虫脚本运行在 Python 子进程中,默认不继承这些变量——除非你主动传入或在启动前设好。
立即学习“Python免费学习笔记(深入)”;
典型现象:VSCode 能装插件,但 requests.get() 仍连不上目标站,报超时或 ConnectionRefused。
实操建议:
- 在终端激活虚拟环境后,先执行
export HTTP_PROXY=http://127.0.0.1:8080(macOS/Linux)或set HTTP_PROXY=http://127.0.0.1:8080(Windows CMD),再启动 VSCode(code .) - 不要依赖 VSCode 设置里的
http.proxy,那个只管 UI 层,不影响 Python 进程 - 若代理需认证,环境变量格式为
http://user:pass@host:port,注意 URL 编码特殊字符 - 临时验证:在 Python 脚本开头加
import os; print(os.environ.get("HTTP_PROXY")),确认变量已注入
proxies 参数优先级高于环境变量,但写错 key 就失效
requests 支持两种代理方式:全局环境变量 or 单次请求的 proxies 参数。后者优先级更高,但 key 必须严格匹配协议 —— "http" 对 HTTP 请求,"https" 对 HTTPS 请求,少一个就 fallback 到直连。
常见错误:
- 只写
{"http": "http://proxy:8080"},但目标 URL 是https://,结果走直连被墙 - 误写成
{"https": "http://..."},协议不一致导致 requests 忽略该条目 - 代理地址漏了
http://前缀,变成{"http": "proxy:8080"},requests 当作域名处理,解析失败
实操建议:
- 统一用完整 URL 形式:
{"http": "http://p:8080", "https": "http://p:8080"}(注意:HTTPS 代理也常用http://协议) - 调试时加
verify=False避免 SSL 证书干扰,但上线前必须删掉 - 把
proxies提成变量,方便切换:例如PROXIES = os.getenv("USE_PROXY") and {"http": "...", "https": "..."} or None
异步爬虫(aiohttp)不读环境变量,ProxyConnector 得手动配
aiohttp 默认完全忽略 HTTP_PROXY 环境变量,也不会自动从 requests 的 proxies 字典取值。你要显式创建带代理的 connector,再传给 ClientSession。
否则现象是:同步 requests 走代理成功,aiohttp 却直连失败,且无任何警告。
实操建议:
- 用
aiohttp.TCPConnector(proxy="http://p:8080")初始化 connector - connector 必须复用,不要每次请求都新建,否则连接池失效
- HTTPS 代理同理,但注意 aiohttp 的
proxy参数本身支持https://或http://,无需额外区分协议 key - 若代理需要 Basic Auth,URL 写成
http://user:pass@p:8080即可,aiohttp 会自动提取
proxies 或 connector 显式覆盖,而不是赌哪一层“应该生效”。

















