先看清楚:一条代理IP在易语言里长什么样
很多人卡住不是因为代码写错,而是没把代理信息拆清楚。你在服务商后台或提取接口拿到的东西,拆开其实是四段:IP、端口、账号、密码。比如提取接口返回的是一行 1.2.3.4:8080 再加一组独立的账号密码,那它在易语言里就应该是两个文本变量,不能靠肉眼拼。
.版本 2
.局部变量 代理IP, 文本型
.局部变量 代理端口, 文本型
.局部变量 代理账号, 文本型
.局部变量 代理密码, 文本型
.局部变量 代理地址, 文本型
代理IP = “要填提取到的IP”
代理端口 = “要填提取到的端口”
代理账号 = “要填账号”
代理密码 = “要填密码”
代理地址 = 代理IP + “:” + 代理端口
注意那个冒号必须是半角冒号,全角冒号会让后面所有请求都报连接失败,这个坑我见过不止一次。拼好之后,代理地址 就是 IP:端口 的样子,后面调用的所有命令都吃这个变量。
把请求发出去:对象方式比自带命令靠谱
易语言自带的 HTTP读文件 这类命令图省事可以,但它没有留出填代理的口子,想要挂代理只能绕。实际项目里更常用的做法是创建一个 WinHttp 对象,一步一步设参数,好处是代理、超时、请求头你都能单独控制。
.版本 2
.局部变量 http, 对象
.局部变量 状态码, 整数型
.局部变量 返回内容, 文本型
.局部变量 目标网址, 文本型
目标网址 = “要访问的页面地址”
http.创建 (“WinHttp.WinHttpRequest.5.1”, )
http.方法 (“Open”, “GET”, 目标网址, 假)
http.方法 (“SetProxy”, 2, 代理地址)
http.方法 (“SetTimeouts”, 3000, 4000, 5000, 9000)
http.方法 (“SetCredentials”, 代理账号, 代理密码, 1)
http.方法 (“Send”, )
状态码 = http.读属性 (“Status”, ).取数值 ()
返回内容 = http.读文本属性 (“ResponseText”, )
这里 SetProxy 第二个参数写 2,表示手动指定代理服务器;最后一个参数 1 表示这组账号密码是给代理用的,而不是给目标网站用的。顺序别乱:先 Open,再 SetProxy,最后 Send。有人把 SetProxy 放到 Send 后面,跑完一脸问号,其实请求早就发出去了。
账号密码认证:Basic 头别拼错
有些场景你不方便用 SetCredentials(比如换了个访问组件),那就手动在请求头里塞凭证。原理很简单:把 账号:密码 拼成一个文本,做一次 BASE64 编码,前面加 Basic 和一个空格,放进 Proxy-Authorization 头里。
.版本 2
.局部变量 凭证, 文本型
凭证 = 到文本 (BASE64编码 (到字节集 (代理账号 + “:” + 代理密码)))
http.方法 (“SetRequestHeader”, “Proxy-Authorization”, “Basic ” + 凭证)
最容易错的三处:冒号用了全角、Basic 后面少敲了空格、把编码前的原文直接塞进去。任何一种都会让你稳定收到 407。如果你用的服务商支持 IP 白名单,那就更省事——把本机的公网出口 IP 加到白名单里,请求时连账号密码都不用带,少一层出错的机会。
| 认证方式 | 配置在哪 | 适合的场景 | 容易出错的地方 |
|---|---|---|---|
| 账号密码认证 | 请求头或 SetCredentials | 出口IP经常变化,如家用宽带、云函数 | 冒号全角、漏空格、编码前原文直接用 |
| IP 白名单 | 服务商后台绑定公网IP | 出口IP固定的机房、公司专线 | 路由器换IP后忘记重新绑定 |
超时怎么设才不卡死
代理和直连最大的区别是:多了一跳,任何一跳慢都会让程序坐在那儿干等。默认超时可能长达几十秒,一个循环跑下来,界面上什么反应都没有,新手往往以为代码挂了。
SetTimeouts 有四个参数,单位都是毫秒,顺序是:解析超时、连接超时、发送超时、接收超时。我的习惯是解析 3000、连接 4000、发送 5000、接收 9000。短效动态 IP 本身存活时间就短,连接阶段给 3 到 5 秒足够,接收阶段留 9 到 15 秒,页面大一点也不会被误杀。
.版本 2
.局部变量 尝试次数, 整数型
.局部变量 成功, 逻辑型
尝试次数 = 0
成功 = 假
.判断循环首 (尝试次数 < 3 且 成功 = 假)
尝试次数 = 尝试次数 + 1
代理地址 = 重新提取一条代理 () ' 失败就换一条新的IP
成功 = 发请求 (代理地址, 目标网址)
.判断循环尾 ()
重试我一般控制在 3 次以内,而且每次重试都重新提取一条 IP,不要在同一个坏节点上反复撞。如果连续三次都失败,多半不是 IP 的问题,而是账号、白名单或者目标页面本身的状态问题,这时候该停下来看返回值,而不是继续循环。
几个新手反复踩的坑
返回空文本、状态码是 0。基本等于没连上。先拿代理地址和端口在本地测一下通不通,再看超时是不是设得太短,尤其是首次连接 HTTPS 站点,握手本身就要花时间。
状态码 502 或 隧道建立失败。代理服务器收到了你的请求,但没法把连接建到目标站。常见原因是目标地址写成了内网地址、端口写错、或者 HTTPS 走了不支持的协议类型。把 SetProxy 的参数和协议类型对一遍基本能定位。
中文变乱码。别直接读 ResponseText,先读成字节集,再用 编码_utf8到gb2312 这类命令转一次。很多页面声明的是 UTF-8,易语言文本框默认吃 GB2312,不转就全是问号。
循环里越跑越慢。检查是不是每次都重建了对象却没收尾,或者每次都在拼一个不断变长的字符串。把对象创建挪到循环外,用完置空,内存和速度都会好很多。
代理IP从哪来,怎么接进易语言
代码写顺了,剩下的问题就是 IP 从哪拿。自己搭代理池维护成本太高,比较实际的做法是接一个现成的代理服务,从 API 提取接口直接拿 IP:端口,塞进上面那段代码就能跑。
我用得比较多的是神龙HTTP。它家有 3000万+ 正规授权代理IP储备,可用率 99.9%,支持 300+ 城市级精准定位——需要哪个地区的 IP,提取时把地区参数带上就行,做公开数据采集和短视频、电商页面的市场研究都比较对路。产品线上短效动态IP、长效静态IP、固定IP代理是一站式的,短效适合按次切换的高并发采集,长效静态适合需要同一个出口IP跑几小时的活儿。
接入层面没什么门槛:API 兼容主流爬虫编程语言,易语言这边就是拿返回的文本做一次分割,文档里有现成的示例代码可参照。个人中心还有可视化用量统计和实时监控,能看出哪个时段请求失败率高、哪批 IP 用得特别快,排查问题时比翻日志快得多。技术团队 7×24 小时在线,卡在认证或者返回码上直接问,比自己试半天强。
常见问题
Q:易语言自带的 HTTP读文件 能直接设代理吗?
不能,它没有留代理参数。要么换成 WinHttp 对象,要么用支持代理设置的网络访问模块,绕不过这一层。改造成本其实不高,就是把一行命令拆成 Open、SetProxy、Send 三步。
Q:为什么账号密码明明是对的,还是返回 407?
先看冒号是不是全角,再看 Basic 后面有没有空格,最后确认编码前用的是原文而不是已经编码过的字符串。另一种情况是这组账号密码只对特定地区的 IP 有效,换个地区的 IP 再试一次。
Q:超时设多少比较合适?
连接 3 到 5 秒、接收 9 到 15 秒是个比较稳的区间。采集大页面时接收超时可以往上加,但连接超时别给太长,短效 IP 存活时间有限,等太久这条 IP 可能已经失效了。
Q:每次都换 IP,为什么失败率反而高了?
大概率是换了 IP 之后没有更新认证信息。用白名单模式的话,换 IP 不影响;用账号密码模式的话,确认新提取的 IP 和账号是配套的。另外把重试次数压在 3 次以内,别让程序在坏节点上无限循环。






