|
易语言里想批量检测网址能不能打开,易语言网最直接的址链办法就是调用“网页_访问”或者“HTTP读文件”这类命令,看返回的接有检测内容长度或者状态码。我试过用“网页_访问”循环跑几百条链接,效性速度还行,批量但遇到超时或者服务器不响应的易语言网情况,程序会卡住。址链后来换成“WinHttp”组件,接有检测设置超时时间,效性稳定性好很多。批量 先看个实际例子。易语言网手头有一份txt文件,址链每行一个网址,接有检测比如: http://www.baidu.com http://www.163.com http://www.qq.com http://www.xxxxxxx.com 要检测这些链接是效性否有效,核心逻辑就是批量逐个访问,判断返回值。易语言里“网页_访问”返回的是字节集,如果长度大于0,基本可以认为链接是通的。但注意,有些网站会返回404页面,内容也有长度,所以最好再检查一下状态码。用“WinHttp”对象的“打开请求”方法,可以拿到状态码,200表示正常,404或者500就是有问题。 下面是我常用的一段代码框架,写在一个按钮事件里: .版本 2 .支持库 internet .子程序 _按钮_开始检测_被单击 .局部变量 链接数组, 文本型, , "0" .局部变量 i, 整数型 .局部变量 单条链接, 文本型 .局部变量 返回状态, 整数型 .局部变量 结果文本, 文本型 链接数组 = 分割文本 (编辑框_链接列表.内容, #换行符, ) 结果文本 = “” .计次循环首 (取数组成员数 (链接数组), i) 单条链接 = 删首尾空 (链接数组 [i]) .如果真 (单条链接 = “”) 到循环尾 () .如果真结束 返回状态 = 取网址状态 (单条链接) .如果 (返回状态 = 200) 结果文本 = 结果文本 + 单条链接 + “ → 有效” + #换行符 .否则 结果文本 = 结果文本 + 单条链接 + “ → 无效 (状态码:” + 到文本 (返回状态) + “)” + #换行符 .如果结束 .计次循环尾 () 编辑框_结果.内容 = 结果文本 “取网址状态”这个子程序,可以用WinHttp实现。关键点:设置超时,不然遇到死链会等很久。我一般设成3000毫秒,也就是3秒。代码大概这样: .子程序 取网址状态, 整数型 .参数 网址, 文本型 .局部变量 WinHttp, 对象 .局部变量 请求, 对象 .局部变量 状态码, 整数型 WinHttp.创建 (“WinHttp.WinHttpRequest.5.1”, ) WinHttp.方法 (“SetTimeouts”, 3000, 3000, 3000, 3000) WinHttp.方法 (“Open”, “GET”, 网址, 假) WinHttp.方法 (“Send”, ) 状态码 = WinHttp.读数值属性 (“Status”, ) 返回 (状态码) 实际跑的时候,有些网站会重定向,比如http自动跳https,WinHttp默认会跟随重定向,状态码最终是200。如果不想跟随,可以设置“EnableRedirects”为假。另外,有些服务器对易语言的默认User-Agent有拦截,返回403。我习惯在Send之前加一行: WinHttp.方法 (“SetRequestHeader”, “User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64)”) 速度方面,单线程跑500条链接,每条平均1秒,大概8分钟。想快就用多线程,易语言里用“线程_启动”开5到10个线程,每个线程处理一部分链接。但注意,多线程操作同一个编辑框或者变量要加锁,不然会出错。我一般把结果写到一个文本文件里,每个线程追加自己的结果,用“写到文件”追加模式,简单省事。 还有个坑:有些链接返回200,但内容是个“域名出售”的页面,这种算不算有效?看你的需求。如果只关心HTTP层面通不通,那就算有效。如果要判断内容是否正常,得再加关键词匹配,比如检查返回文本里有没有“404”或者“无法访问”之类的字眼。我一般只做状态码检测,够用了。 最后提醒一句,批量检测别跑太猛,尤其是对方服务器有频率限制的时候。加个延时,比如每检测完一条,延时100毫秒。不然容易被封IP。我吃过亏,一次跑2000条,结果本地网络被临时限制,重启路由器才恢复。 |