Skip to content
HadesTop edited this page Aug 14, 2026 · 4 revisions

IPClick

一个 gRPC 分布式 HTTP 请求代理。 把「发 HTTP 请求」这件事变成一个可以跨机器调度的 服务:调用方说要抓哪个网址,服务端用合适的适配器去抓——普通 HTTP、带 TLS 指纹伪装的、 或者真起一个浏览器把 JS 跑完再取 DOM。

from ipclick import Downloader

with Downloader() as d:
    resp = d.get("https://example.com")
    print(resp.status_code, len(resp.content))
    print(resp.trace.node_id, resp.trace.adapter, resp.trace.attempts)

它解决什么问题

你想做的事 IPClick 怎么做
从多台机器的出口 IP 发请求 集群:任务打给任一节点,按策略分发到其余节点执行
目标站点认 TLS 指纹 默认适配器 curl_cffi 自带浏览器指纹伪装
页面内容要 JS 跑完才有 浏览器渲染:四个引擎可选,返回渲染后的 DOM
想知道刚才那个请求为什么 403 链路记录:每个请求记一条,Web 端可查
不想把对方站点打挂 按 host 限流:并发与 QPS 双闸门
服务端不能被当成内网跳板 SSRF 防护:协议白名单 + 内网/元数据地址拦截

五分钟上手

pip install ipclick          # 17 个包,只带默认适配器
ipclick init                 # 生成 ipclick.toml 与 .env(600 权限)
ipclick run -w               # 起服务 + Web 管理端

控制台会打出 Web 管理端地址与登录信息。然后:

from ipclick import Downloader

with Downloader() as d:                       # 不配置就连本机
    print(d.get("https://example.com").status_code)

详见 快速开始

设计上的几条硬规矩

这些规矩贯穿整个代码库,读代码前知道它们会省很多事:

  1. 配置错误必须报错,绝不静默降级。 mode = "cluster" 却没配节点 → 直接失败, 而不是悄悄退回单机。静默降级的问题会在你最需要它工作的时候才暴露。
  2. 只有瞬时传输故障才返回 status_code == -1 参数写错、鉴权失败、依赖没装 一律抛异常。把用法错误伪装成网络故障会让人查错方向。
  3. 不做无谓的重试。 参数错误、脚本语法错、服务端能力缺失,重试多少次都是同样的 结果,只会拖慢失败反馈。见故障排查
  4. 机密不进配置文件。 令牌、密码、集群密钥走 .env 或环境变量;写进 ipclick.toml 仍然生效,但启动时会点名提醒。见安全
  5. 可观测性数据绝不反压业务。 链路记录写盘跟不上就丢弃并计数, 丢了要能看见——静默丢弃比丢弃更糟。

从哪开始读

版本

当前 0.3.0。完整变更见仓库里的 CHANGELOG.md

0.3.0 是一次较大的改动:集群新增「服务端转发」形态、Prometheus 换成内置链路记录、 Web 管理端从只读看板变成可配置可试请求的管理界面,并移除了 httpx 适配器。 升级前请看 CHANGELOG 的「破坏性变更」一节。

Clone this wiki locally