网页_访问(winnet)命令与网页_访问_对象(winhttp)命令区别

之前我一直以为就那样,一种专一,一种广泛,不求甚解。直到今天碰到这个问题:
描述:

自己得某个程序,多线程中,相比之前慢了很多很多。一种没找出问题。因为又不能直接调试找问题。

用了缓存,尝试了多种方法提高速度。就是没效果。

直到我用个笨方法插入大量调试输出及打印耗时表。才定位到是网页访问得问题。

亏我用了10年易。真跪了

7Win 发表于 2016-5-11 22:49
winnet需要手动处理Cookie,winhttp

 

网页访问对象可以说是专门为多线程写的

  1. .版本 2
  2.  
  3. .子程序 网页_访问, 字节集, 公开, 使用WinInet的方式访问网页
  4. .参数 网址, 文本型, , 完整的网页地址,必须包含http://或者https://
  5. .参数 访问方式, 整数型, 可空, 0=GET 1=POST 2=HEAD
  6. .参数 提交信息, 文本型, 可空, POST专用
  7. .参数 提交Cookies, 文本型, 参考 可空, 本参数传递变量时会自动回传返回的Cookie
  8. .参数 返回Cookies, 文本型, 可空, 返回的Cookie
  9. .参数 附加协yi头, 文本型, 可空, 一行一个请用换行符隔开,建议填写常量值或文本值,防止因传参引发错误
  10. .参数 返回协yi头, 文本型, 参考 可空, 返回的协yi头
  11. .参数 禁止重定向, 逻辑型, 可空, 默认不禁止网页重定向
  12. .参数 字节集提交, 字节集, 可空, 提交字节集数据
  13. .参数 代理地址, 文本型, 可空, 代理地址,格式为 8.8.8.8:88
  14. .局部变量 局_Internet句柄, 整数型
  15. .局部变量 局_Internet连接句柄, 整数型
  16. .局部变量 局_HTTP请求句柄, 整数型
  17. .局部变量 局_计次, 整数型
  18. .局部变量 局_字节集, 字节集
  19. .局部变量 局_访问方式, 文本型
  20. .局部变量 局_User_Agent, 文本型
  21. .局部变量 局_返回协yi头, 文本型, , "0"
  22. .局部变量 局_页面内容, 字节集
  23. .局部变量 局_请求标记, 整数型
  24. .局部变量 局_重定向地址, 文本型
  25. .局部变量 局_HTTPS, 逻辑型
  26.  
  27. ' 局_访问方式 = 选择 (访问方式 = 1, “POST”, “GET”)
  28. .如果真 (访问方式 < 0 或 访问方式 > 2)
  29. 访问方式 = 0
  30. .如果真结束
  31. 局_访问方式 = 多项选择 (访问方式 + 1, “GET”, “POST”, “HEAD”)
  32.  
  33. .如果真 (到小写 (取文本左边 (网址, 5)) = “https”)
  34. 局_HTTPS = 真
  35. .如果真结束
  36.  
  37. .判断开始 (寻找文本 (附加协yi头, “User-Agent:”, , 真) ≠ -1)
  38. 局_User_Agent = 删首尾空 (文本_取出中间文本 (附加协yi头, “User-Agent:”, #换行符))
  39. .如果真 (局_User_Agent = “”)
  40. 局_User_Agent = 内部_协yi头取值 (附加协yi头)
  41. .如果真结束
  42.  
  43. .默认
  44. 局_User_Agent = “Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)”
  45. .判断结束
  46.  
  47. .判断开始 (代理地址 = “”)
  48. 局_Internet句柄 = InternetOpenA (局_User_Agent, 1, 字符 (0), 字符 (0), 0)
  49. .默认
  50. .判断开始 (局_HTTPS) ' 用于解决win7下https协yi代理无效问题
  51. 局_Internet句柄 = InternetOpenA (局_User_Agent, 3, 代理地址, “”, 0)
  52. .默认
  53. 局_Internet句柄 = InternetOpenA (局_User_Agent, 3, “http=” + 代理地址, “”, 0)
  54. .判断结束
  55.  
  56. .判断结束
  57.  
  58. .如果真 (局_Internet句柄 = 0)
  59. InternetCloseHandle (局_Internet句柄)
  60. 返回 ({ })
  61. .如果真结束
  62. 局_Internet连接句柄 = InternetConnectA (局_Internet句柄, 网页_取域名 (网址), 网页_取端口 (网址), 字符 (0), 字符 (0), 3, 0, 0)
  63. .如果真 (局_Internet连接句柄 = 0)
  64. InternetCloseHandle (局_Internet连接句柄)
  65. InternetCloseHandle (局_Internet句柄)
  66. 返回 ({ })
  67. .如果真结束
  68.  
  69. 局_请求标记 = 位或 (#INTERNET_FLAG_RELOAD, #INTERNET_COOKIE_THIRD_PARTY)
  70. .如果真 (取反 (是否为空 (提交Cookies)))
  71. 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_NO_COOKIES)
  72. .如果真结束
  73.  
  74. .如果真 (禁止重定向)
  75. 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_NO_AUTO_REDIRECT)
  76. .如果真结束
  77.  
  78. .判断开始 (局_HTTPS)
  79. 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_SECURE)
  80. .默认
  81. 局_请求标记 = 位或 (局_请求标记, #INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS)
  82. .判断结束
  83.  
  84. 局_HTTP请求句柄 = HttpOpenRequestA (局_Internet连接句柄, 局_访问方式, 网页_取页面地址 (网址), “HTTP/1.1”, 字符 (0), 字符 (0), 局_请求标记, 0)
  85. .如果真 (局_HTTP请求句柄 = 0)
  86. InternetCloseHandle (局_HTTP请求句柄)
  87. InternetCloseHandle (局_Internet连接句柄)
  88. InternetCloseHandle (局_Internet句柄)
  89. 返回 ({ })
  90. .如果真结束
  91.  
  92.  
  93. .判断开始 (附加协yi头 = “”)
  94. 附加协yi头 = “Accept: */*
  95. .默认
  96. .如果真 (寻找文本 (附加协yi头, “Accept:”, , 假) = -1)
  97. 附加协yi头 = 附加协yi头 + #换行符 + “Accept: */*”
  98. .如果真结束
  99.  
  100. .判断结束
  101.  
  102. .如果真 (寻找文本 (附加协yi头, “Referer:”, , 假) = -1)
  103. 附加协yi头 = 附加协yi头 + #换行符 + “Referer: ” + 网址
  104. .如果真结束
  105.  
  106. .如果真 (寻找文本 (附加协yi头, “Accept-Language:”, , 假) = -1)
  107. 附加协yi头 = 附加协yi头 + #换行符 + “Accept-Language: zh-cn”
  108. .如果真结束
  109.  
  110. .如果真 (寻找文本 (附加协yi头, “Content-Type:”, , 假) = -1)
  111. 附加协yi头 = 附加协yi头 + #换行符 + “Content-Type: application/x-www-form-urlencoded”
  112. .如果真结束
  113.  
  114. .如果真 (提交Cookies ≠ “”)
  115. 附加协yi头 = 附加协yi头 + #换行符 + “Cookie: ” + 提交Cookies
  116. .如果真结束
  117.  
  118.  
  119. .判断开始 (访问方式 = 0)
  120. HttpSendRequestA (局_HTTP请求句柄, 附加协yi头, 取文本长度 (附加协yi头), “”, 0)
  121. .默认
  122. .如果真 (字节集提交 = { })
  123. 字节集提交 = 到字节集 (提交信息)
  124. .如果真结束
  125. HttpSendRequestA_字节集 (局_HTTP请求句柄, 附加协yi头, 取文本长度 (附加协yi头), 字节集提交, 取字节集长度 (字节集提交))
  126. .判断结束
  127. 局_计次 = 0
  128. 局_字节集 = 取空白字节集 (1024)
  129. .循环判断首 ()
  130. InternetReadFile (局_HTTP请求句柄, 局_字节集, 1024, 局_计次)
  131. 局_页面内容 = 局_页面内容 + 取字节集左边 (局_字节集, 局_计次)
  132. .循环判断尾 (局_计次 ≠ 0)
  133. 返回协yi头 = 取空白文本 (5000)
  134. HttpQueryInfoA (局_HTTP请求句柄, 22, 返回协yi头, 5000, 0)
  135. 返回协yi头 = 子文本替换 (返回协yi头, “Set-Cookie”, “Set-Cookie”, , , 假)
  136. InternetCloseHandle (局_HTTP请求句柄)
  137. InternetCloseHandle (局_Internet连接句柄)
  138. InternetCloseHandle (局_Internet句柄)
  139. 局_返回协yi头 = 分割文本 (返回协yi头, #换行符, )
  140. 返回Cookies = “”
  141. .计次循环首 (取数组成员数 (局_返回协yi头), 局_计次)
  142. .如果真 (寻找文本 (局_返回协yi头 [局_计次], “Set-Cookie”, , 假) ≠ -1)
  143. .判断开始 (寻找文本 (局_返回协yi头 [局_计次], “;”, , 假) ≠ -1)
  144. 返回Cookies = 返回Cookies + 删首尾空 (文本_取出中间文本 (局_返回协yi头 [局_计次], “Set-Cookie:”, “;)) + “;
  145. .默认
  146. 返回Cookies = 返回Cookies + 删首尾空 (子文本替换 (局_返回协yi头 [局_计次], “Set-Cookie:”, , , , 假)) + “;
  147. .判断结束
  148.  
  149. .如果真结束
  150.  
  151. .计次循环尾 ()
  152. 返回Cookies = 取文本左边 (返回Cookies, 取文本长度 (返回Cookies)2)
  153. .如果真 (取反 (是否为空 (提交Cookies)))
  154. 网页_Cookie合并更新 (提交Cookies, 返回Cookies)
  155. .如果真结束
  156. 返回 (局_页面内容)
  1. .版本 2
  2.  
  3. .子程序 网页_访问_对象, 字节集, 公开, 使用WinHttp对象的方式访问网页
  4. .参数 网址, 文本型, , 完整的网页地址,必须包含http://或者https://
  5. .参数 访问方式, 整数型, 可空, 0=GET 1=POST 2=HEAD
  6. .参数 提交信息, 文本型, 可空, "POST"专用
  7. .参数 提交Cookies, 文本型, 参考 可空, 本参数传递变量时会自动回传返回的Cookie
  8. .参数 返回Cookies, 文本型, 参考 可空, 返回的Cookie
  9. .参数 附加协yi头, 文本型, 可空, 一行一个请用换行符隔开
  10. .参数 返回协yi头, 文本型, 参考 可空, 返回的协yi头
  11. .参数 返回状态代码, 整数型, 参考 可空, 网页返回的状态代码,例如:200;302;404等
  12. .参数 禁止重定向, 逻辑型, 可空, 默认不禁止网页重定向
  13. .参数 字节集提交, 字节集, 可空, 提交字节集数据
  14. .参数 代理地址, 文本型, 可空, 代理地址,格式为 8.8.8.8:88
  15. .参数 超时, 整数型, 可空, 秒|默认为15秒,-1为无限等待
  16. .参数 用户名, 文本型, 可空, 用户名
  17. .参数 密码, 文本型, 可空, 密码
  18. .参数 代理标识, 整数型, 可空, 代理标识,默认为10为路由器
  19. .参数 对象继承, 对象, 可空, 此处可自行提供对象,不再主动创建
  20. .局部变量 局_访问方式, 文本型
  21. .局部变量 局_WinHttp, 对象
  22. .局部变量 局_发送协yi头, 文本型, , "0"
  23. .局部变量 局_返回协yi头, 文本型, , "0"
  24. .局部变量 局_计次, 整数型
  25. .局部变量 局_网页数据, 字节集
  26. .局部变量 局_变体提交, 变体型
  27.  
  28. 线程_初始化COM库 ()
  29. ' 局_访问方式 = 选择 (访问方式 = 1, “POST”, “GET”)
  30. .如果真 (访问方式 < 0 或 访问方式 > 2)
  31. 访问方式 = 0
  32. .如果真结束
  33. 局_访问方式 = 多项选择 (访问方式 + 1, “GET”, “POST”, “HEAD”)
  34.  
  35. .判断开始 (是否为空 (对象继承))
  36. .如果真 (局_WinHttp.创建 (“WinHttp.WinHttpRequest.5.1”, ) = 假)
  37. 返回 ({ })
  38. .如果真结束
  39.  
  40. .默认
  41. 局_WinHttp = 对象继承
  42. .判断结束
  43. ' 局部_WinHttp.查看 ()
  44. .如果真 (超时 ≠ -1)
  45. .如果 (超时 < 1)
  46. 超时 = 15000
  47. .否则
  48. 超时 = 超时 × 1000
  49. .如果结束
  50. 局_WinHttp.方法 (“SetTimeouts”, 超时, 超时, 超时, 超时)
  51. .如果真结束
  52.  
  53. .如果真 (代理地址 ≠ “”)
  54. 局_WinHttp.方法 (“SetProxy”, 2, 代理地址)
  55. .如果真 (用户名 ≠ “”)
  56. .如果真 (是否为空 (代理标识))
  57. 代理标识 = 1
  58. .如果真结束
  59. 局_WinHttp.方法 (“SetProxyCredentials”, 用户名, 密码, 代理标识)
  60. .如果真结束
  61.  
  62. .如果真结束
  63. 局_WinHttp.方法 (“Open”, 局_访问方式, 网址, 假)
  64. .如果真 (禁止重定向)
  65. 局_WinHttp.写属性 (“Option”, 6, 0)
  66. .如果真结束
  67.  
  68. 局_WinHttp.写属性 (“Option”, 4, 13056)
  69.  
  70. .判断开始 (附加协yi头 = “”)
  71. 附加协yi头 = “Accept: */*
  72. .默认
  73. .如果真 (寻找文本 (附加协yi头, “Accept:”, , 假) = -1)
  74. 附加协yi头 = 附加协yi头 + #换行符 + “Accept: */*”
  75. .如果真结束
  76.  
  77. .判断结束
  78.  
  79. .如果真 (寻找文本 (附加协yi头, “Referer:”, , 假) = -1)
  80. 附加协yi头 = 附加协yi头 + #换行符 + “Referer: ” + 网址
  81. .如果真结束
  82.  
  83. .如果真 (寻找文本 (附加协yi头, “Accept-Language:”, , 假) = -1)
  84. 附加协yi头 = 附加协yi头 + #换行符 + “Accept-Language: zh-cn”
  85. .如果真结束
  86.  
  87. .如果真 (寻找文本 (附加协yi头, “User-Agent:”, , 假) = -1)
  88. 附加协yi头 = 附加协yi头 + #换行符 + “User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)”
  89. .如果真结束
  90.  
  91. .如果真 (寻找文本 (附加协yi头, “Content-Type:”, , 假) = -1)
  92. 附加协yi头 = 附加协yi头 + #换行符 + “Content-Type: application/x-www-form-urlencoded”
  93. .如果真结束
  94.  
  95. .如果真 (提交Cookies ≠ “”)
  96. 局_WinHttp.方法 (“SetRequestHeader”, “Cookie”, 提交Cookies)
  97. .如果真结束
  98.  
  99. .判断开始 (寻找文本 (附加协yi头, #换行符, , 假) = -1)
  100. 局_WinHttp.方法 (“SetRequestHeader”, 内部_协yi头取名 (附加协yi头), 内部_协yi头取值 (附加协yi头))
  101. .默认
  102. 局_发送协yi头 = 分割文本 (附加协yi头, #换行符, )
  103. .计次循环首 (取数组成员数 (局_发送协yi头), 局_计次)
  104. .如果真 (局_发送协yi头 [局_计次] ≠ “”)
  105. 局_WinHttp.方法 (“SetRequestHeader”, 内部_协yi头取名 (局_发送协yi头 [局_计次]), 内部_协yi头取值 (局_发送协yi头 [局_计次]))
  106. .如果真结束
  107.  
  108. .计次循环尾 ()
  109. .判断结束
  110.  
  111. .判断开始 (字节集提交 = { })
  112. 局_WinHttp.方法 (“Send”, 提交信息)
  113. .默认
  114. 局_变体提交.赋值 (字节集提交, )
  115. 局_WinHttp.方法 (“Send”, 局_变体提交)
  116. .判断结束
  117. 局_网页数据 = 局_WinHttp.读属性 (“ResponseBody”, ).取字节集 ()
  118. 返回协yi头 = 局_WinHttp.读文本属性 (“GetallResponseHeaders”, )
  119. 返回协yi头 = 子文本替换 (返回协yi头, “Set-Cookie”, “Set-Cookie”, , , 假)
  120. 返回状态代码 = 局_WinHttp.读数值属性 (“Status”, )
  121. 局_返回协yi头 = 分割文本 (返回协yi头, #换行符, )
  122. 返回Cookies = “”
  123. .计次循环首 (取数组成员数 (局_返回协yi头), 局_计次)
  124. .如果真 (寻找文本 (局_返回协yi头 [局_计次], “Set-Cookie”, , 假) ≠ -1)
  125. .判断开始 (寻找文本 (局_返回协yi头 [局_计次], “;”, , 假) ≠ -1)
  126. 返回Cookies = 返回Cookies + 删首尾空 (文本_取出中间文本 (局_返回协yi头 [局_计次], “Set-Cookie:”, “;)) + “;
  127. .默认
  128. 返回Cookies = 返回Cookies + 删首尾空 (子文本替换 (局_返回协yi头 [局_计次], “Set-Cookie:”, , , , 假)) + “;
  129. .判断结束
  130.  
  131. .如果真结束
  132.  
  133. .计次循环尾 ()
  134. 返回Cookies = 取文本左边 (返回Cookies, 取文本长度 (返回Cookies)2)
  135. 网页_Cookie合并更新 (提交Cookies, 返回Cookies)
  136. 局_WinHttp.清除 ()
  137. 线程_取消COM库 ()
  138. 返回 (局_网页数据)

 

发表评论

邮箱地址不会被公开。 必填项已用*标注