之前我一直以为就那样,一种专一,一种广泛,不求甚解。直到今天碰到这个问题:
描述:
自己得某个程序,多线程中,相比之前慢了很多很多。一种没找出问题。因为又不能直接调试找问题。
用了缓存,尝试了多种方法提高速度。就是没效果。
直到我用个笨方法插入大量调试输出及打印耗时表。才定位到是网页访问得问题。
亏我用了10年易。真跪了
7Win 发表于 2016-5-11 22:49
winnet需要手动处理Cookie,winhttp
网页访问对象可以说是专门为多线程写的
- .版本 2
-
- .子程序 网页_访问, 字节集, 公开, 使用WinInet的方式访问网页
- .参数 网址, 文本型, , 完整的网页地址,必须包含http://或者https://
- .参数 访问方式, 整数型, 可空, 0=GET 1=POST 2=HEAD
- .参数 提交信息, 文本型, 可空, POST专用
- .参数 提交Cookies, 文本型, 参考 可空, 本参数传递变量时会自动回传返回的Cookie
- .参数 返回Cookies, 文本型, 可空, 返回的Cookie
- .参数 附加协yi头, 文本型, 可空, 一行一个请用换行符隔开,建议填写常量值或文本值,防止因传参引发错误
- .参数 返回协yi头, 文本型, 参考 可空, 返回的协yi头
- .参数 禁止重定向, 逻辑型, 可空, 默认不禁止网页重定向
- .参数 字节集提交, 字节集, 可空, 提交字节集数据
- .参数 代理地址, 文本型, 可空, 代理地址,格式为 8.8.8.8:88
- .局部变量 局_Internet句柄, 整数型
- .局部变量 局_Internet连接句柄, 整数型
- .局部变量 局_HTTP请求句柄, 整数型
- .局部变量 局_计次, 整数型
- .局部变量 局_字节集, 字节集
- .局部变量 局_访问方式, 文本型
- .局部变量 局_User_Agent, 文本型
- .局部变量 局_返回协yi头, 文本型, , "0"
- .局部变量 局_页面内容, 字节集
- .局部变量 局_请求标记, 整数型
- .局部变量 局_重定向地址, 文本型
- .局部变量 局_HTTPS, 逻辑型
-
- ' 局_访问方式 = 选择 (访问方式 = 1, “POST”, “GET”)
- .如果真 (访问方式 < 0 或 访问方式 > 2)
- 访问方式 = 0
- .如果真结束
- 局_访问方式 = 多项选择 (访问方式 + 1, “GET”, “POST”, “HEAD”)
-
- .如果真 (到小写 (取文本左边 (网址, 5)) = “https”)
- 局_HTTPS = 真
- .如果真结束
-
- .判断开始 (寻找文本 (附加协yi头, “User-Agent:”, , 真) ≠ -1)
- 局_User_Agent = 删首尾空 (文本_取出中间文本 (附加协yi头, “User-Agent:”, #换行符))
- .如果真 (局_User_Agent = “”)
- 局_User_Agent = 内部_协yi头取值 (附加协yi头)
- .如果真结束
-
- .默认
- 局_User_Agent = “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)”
- .判断结束
-
- .判断开始 (代理地址 = “”)
- 局_Internet句柄 = InternetOpenA (局_User_Agent, 1, 字符 (0), 字符 (0), 0)
- .默认
- .判断开始 (局_HTTPS) ' 用于解决win7下https协yi代理无效问题
- 局_Internet句柄 = InternetOpenA (局_User_Agent, 3, 代理地址, “”, 0)
- .默认
- 局_Internet句柄 = InternetOpenA (局_User_Agent, 3, “http=” + 代理地址, “”, 0)
- .判断结束
-
- .判断结束
-
- .如果真 (局_Internet句柄 = 0)
- InternetCloseHandle (局_Internet句柄)
- 返回 ({ })
- .如果真结束
- 局_Internet连接句柄 = InternetConnectA (局_Internet句柄, 网页_取域名 (网址), 网页_取端口 (网址), 字符 (0), 字符 (0), 3, 0, 0)
- .如果真 (局_Internet连接句柄 = 0)
- InternetCloseHandle (局_Internet连接句柄)
- InternetCloseHandle (局_Internet句柄)
- 返回 ({ })
- .如果真结束
-
- 局_请求标记 = 位或 (#INTERNET_FLAG_RELOAD, #INTERNET_COOKIE_THIRD_PARTY)
- .如果真 (取反 (是否为空 (提交Cookies)))
- 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_NO_COOKIES)
- .如果真结束
-
- .如果真 (禁止重定向)
- 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_NO_AUTO_REDIRECT)
- .如果真结束
-
- .判断开始 (局_HTTPS)
- 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_SECURE)
- .默认
- 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS)
- .判断结束
-
- 局_HTTP请求句柄 = HttpOpenRequestA (局_Internet连接句柄, 局_访问方式, 网页_取页面地址 (网址), “HTTP/1.1”, 字符 (0), 字符 (0), 局_请求标记, 0)
- .如果真 (局_HTTP请求句柄 = 0)
- InternetCloseHandle (局_HTTP请求句柄)
- InternetCloseHandle (局_Internet连接句柄)
- InternetCloseHandle (局_Internet句柄)
- 返回 ({ })
- .如果真结束
-
-
- .判断开始 (附加协yi头 = “”)
- 附加协yi头 = “Accept: */*”
- .默认
- .如果真 (寻找文本 (附加协yi头, “Accept:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Accept: */*”
- .如果真结束
-
- .判断结束
-
- .如果真 (寻找文本 (附加协yi头, “Referer:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Referer: ” + 网址
- .如果真结束
-
- .如果真 (寻找文本 (附加协yi头, “Accept-Language:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Accept-Language: zh-cn”
- .如果真结束
-
- .如果真 (寻找文本 (附加协yi头, “Content-Type:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Content-Type: application/x-www-form-urlencoded”
- .如果真结束
-
- .如果真 (提交Cookies ≠ “”)
- 附加协yi头 = 附加协yi头 + #换行符 + “Cookie: ” + 提交Cookies
- .如果真结束
-
-
- .判断开始 (访问方式 = 0)
- HttpSendRequestA (局_HTTP请求句柄, 附加协yi头, 取文本长度 (附加协yi头), “”, 0)
- .默认
- .如果真 (字节集提交 = { })
- 字节集提交 = 到字节集 (提交信息)
- .如果真结束
- HttpSendRequestA_字节集 (局_HTTP请求句柄, 附加协yi头, 取文本长度 (附加协yi头), 字节集提交, 取字节集长度 (字节集提交))
- .判断结束
- 局_计次 = 0
- 局_字节集 = 取空白字节集 (1024)
- .循环判断首 ()
- InternetReadFile (局_HTTP请求句柄, 局_字节集, 1024, 局_计次)
- 局_页面内容 = 局_页面内容 + 取字节集左边 (局_字节集, 局_计次)
- .循环判断尾 (局_计次 ≠ 0)
- 返回协yi头 = 取空白文本 (5000)
- HttpQueryInfoA (局_HTTP请求句柄, 22, 返回协yi头, 5000, 0)
- 返回协yi头 = 子文本替换 (返回协yi头, “Set-Cookie”, “Set-Cookie”, , , 假)
- InternetCloseHandle (局_HTTP请求句柄)
- InternetCloseHandle (局_Internet连接句柄)
- InternetCloseHandle (局_Internet句柄)
- 局_返回协yi头 = 分割文本 (返回协yi头, #换行符, )
- 返回Cookies = “”
- .计次循环首 (取数组成员数 (局_返回协yi头), 局_计次)
- .如果真 (寻找文本 (局_返回协yi头 [局_计次], “Set-Cookie”, , 假) ≠ -1)
- .判断开始 (寻找文本 (局_返回协yi头 [局_计次], “;”, , 假) ≠ -1)
- 返回Cookies = 返回Cookies + 删首尾空 (文本_取出中间文本 (局_返回协yi头 [局_计次], “Set-Cookie:”, “;”)) + “; ”
- .默认
- 返回Cookies = 返回Cookies + 删首尾空 (子文本替换 (局_返回协yi头 [局_计次], “Set-Cookie:”, , , , 假)) + “; ”
- .判断结束
-
- .如果真结束
-
- .计次循环尾 ()
- 返回Cookies = 取文本左边 (返回Cookies, 取文本长度 (返回Cookies) - 2)
- .如果真 (取反 (是否为空 (提交Cookies)))
- 网页_Cookie合并更新 (提交Cookies, 返回Cookies)
- .如果真结束
- 返回 (局_页面内容)
- .版本 2
-
- .子程序 网页_访问_对象, 字节集, 公开, 使用WinHttp对象的方式访问网页
- .参数 网址, 文本型, , 完整的网页地址,必须包含http://或者https://
- .参数 访问方式, 整数型, 可空, 0=GET 1=POST 2=HEAD
- .参数 提交信息, 文本型, 可空, "POST"专用
- .参数 提交Cookies, 文本型, 参考 可空, 本参数传递变量时会自动回传返回的Cookie
- .参数 返回Cookies, 文本型, 参考 可空, 返回的Cookie
- .参数 附加协yi头, 文本型, 可空, 一行一个请用换行符隔开
- .参数 返回协yi头, 文本型, 参考 可空, 返回的协yi头
- .参数 返回状态代码, 整数型, 参考 可空, 网页返回的状态代码,例如:200;302;404等
- .参数 禁止重定向, 逻辑型, 可空, 默认不禁止网页重定向
- .参数 字节集提交, 字节集, 可空, 提交字节集数据
- .参数 代理地址, 文本型, 可空, 代理地址,格式为 8.8.8.8:88
- .参数 超时, 整数型, 可空, 秒|默认为15秒,-1为无限等待
- .参数 用户名, 文本型, 可空, 用户名
- .参数 密码, 文本型, 可空, 密码
- .参数 代理标识, 整数型, 可空, 代理标识,默认为1,0为路由器
- .参数 对象继承, 对象, 可空, 此处可自行提供对象,不再主动创建
- .局部变量 局_访问方式, 文本型
- .局部变量 局_WinHttp, 对象
- .局部变量 局_发送协yi头, 文本型, , "0"
- .局部变量 局_返回协yi头, 文本型, , "0"
- .局部变量 局_计次, 整数型
- .局部变量 局_网页数据, 字节集
- .局部变量 局_变体提交, 变体型
-
- 线程_初始化COM库 ()
- ' 局_访问方式 = 选择 (访问方式 = 1, “POST”, “GET”)
- .如果真 (访问方式 < 0 或 访问方式 > 2)
- 访问方式 = 0
- .如果真结束
- 局_访问方式 = 多项选择 (访问方式 + 1, “GET”, “POST”, “HEAD”)
-
- .判断开始 (是否为空 (对象继承))
- .如果真 (局_WinHttp.创建 (“WinHttp.WinHttpRequest.5.1”, ) = 假)
- 返回 ({ })
- .如果真结束
-
- .默认
- 局_WinHttp = 对象继承
- .判断结束
- ' 局部_WinHttp.查看 ()
- .如果真 (超时 ≠ -1)
- .如果 (超时 < 1)
- 超时 = 15000
- .否则
- 超时 = 超时 × 1000
- .如果结束
- 局_WinHttp.方法 (“SetTimeouts”, 超时, 超时, 超时, 超时)
- .如果真结束
-
- .如果真 (代理地址 ≠ “”)
- 局_WinHttp.方法 (“SetProxy”, 2, 代理地址)
- .如果真 (用户名 ≠ “”)
- .如果真 (是否为空 (代理标识))
- 代理标识 = 1
- .如果真结束
- 局_WinHttp.方法 (“SetProxyCredentials”, 用户名, 密码, 代理标识)
- .如果真结束
-
- .如果真结束
- 局_WinHttp.方法 (“Open”, 局_访问方式, 网址, 假)
- .如果真 (禁止重定向)
- 局_WinHttp.写属性 (“Option”, 6, 0)
- .如果真结束
-
- 局_WinHttp.写属性 (“Option”, 4, 13056)
-
- .判断开始 (附加协yi头 = “”)
- 附加协yi头 = “Accept: */*”
- .默认
- .如果真 (寻找文本 (附加协yi头, “Accept:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Accept: */*”
- .如果真结束
-
- .判断结束
-
- .如果真 (寻找文本 (附加协yi头, “Referer:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Referer: ” + 网址
- .如果真结束
-
- .如果真 (寻找文本 (附加协yi头, “Accept-Language:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Accept-Language: zh-cn”
- .如果真结束
-
- .如果真 (寻找文本 (附加协yi头, “User-Agent:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)”
- .如果真结束
-
- .如果真 (寻找文本 (附加协yi头, “Content-Type:”, , 假) = -1)
- 附加协yi头 = 附加协yi头 + #换行符 + “Content-Type: application/x-www-form-urlencoded”
- .如果真结束
-
- .如果真 (提交Cookies ≠ “”)
- 局_WinHttp.方法 (“SetRequestHeader”, “Cookie”, 提交Cookies)
- .如果真结束
-
- .判断开始 (寻找文本 (附加协yi头, #换行符, , 假) = -1)
- 局_WinHttp.方法 (“SetRequestHeader”, 内部_协yi头取名 (附加协yi头), 内部_协yi头取值 (附加协yi头))
- .默认
- 局_发送协yi头 = 分割文本 (附加协yi头, #换行符, )
- .计次循环首 (取数组成员数 (局_发送协yi头), 局_计次)
- .如果真 (局_发送协yi头 [局_计次] ≠ “”)
- 局_WinHttp.方法 (“SetRequestHeader”, 内部_协yi头取名 (局_发送协yi头 [局_计次]), 内部_协yi头取值 (局_发送协yi头 [局_计次]))
- .如果真结束
-
- .计次循环尾 ()
- .判断结束
-
- .判断开始 (字节集提交 = { })
- 局_WinHttp.方法 (“Send”, 提交信息)
- .默认
- 局_变体提交.赋值 (字节集提交, )
- 局_WinHttp.方法 (“Send”, 局_变体提交)
- .判断结束
- 局_网页数据 = 局_WinHttp.读属性 (“ResponseBody”, ).取字节集 ()
- 返回协yi头 = 局_WinHttp.读文本属性 (“GetallResponseHeaders”, )
- 返回协yi头 = 子文本替换 (返回协yi头, “Set-Cookie”, “Set-Cookie”, , , 假)
- 返回状态代码 = 局_WinHttp.读数值属性 (“Status”, )
- 局_返回协yi头 = 分割文本 (返回协yi头, #换行符, )
- 返回Cookies = “”
- .计次循环首 (取数组成员数 (局_返回协yi头), 局_计次)
- .如果真 (寻找文本 (局_返回协yi头 [局_计次], “Set-Cookie”, , 假) ≠ -1)
- .判断开始 (寻找文本 (局_返回协yi头 [局_计次], “;”, , 假) ≠ -1)
- 返回Cookies = 返回Cookies + 删首尾空 (文本_取出中间文本 (局_返回协yi头 [局_计次], “Set-Cookie:”, “;”)) + “; ”
- .默认
- 返回Cookies = 返回Cookies + 删首尾空 (子文本替换 (局_返回协yi头 [局_计次], “Set-Cookie:”, , , , 假)) + “; ”
- .判断结束
-
- .如果真结束
-
- .计次循环尾 ()
- 返回Cookies = 取文本左边 (返回Cookies, 取文本长度 (返回Cookies) - 2)
- 网页_Cookie合并更新 (提交Cookies, 返回Cookies)
- 局_WinHttp.清除 ()
- 线程_取消COM库 ()
- 返回 (局_网页数据)