ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wcymiss

[原创] 不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-24 20:46 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 wcymiss 于 2014-11-24 20:52 编辑
onthetrip 发表于 2014-11-24 19:57
吴姐,按照您的提示,我已经成功将responsetext的乱码问题解决了,谢谢.
但还有几个Adodb.stream的转码问题 ...


(1)、(2)、晕的。那是我写错了。StrToUTF8Byte函数里面的应该是.Charset = "UTF-8" 。我已经请版主帮我修改了。不过这个网站上传文件用UTF-8或是GB2312都能成功的。

(3)、是的。也有各种编码之分。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-24 21:12 | 显示全部楼层
wcymiss 发表于 2014-11-24 20:46
(1)、(2)、晕的。那是我写错了。StrToUTF8Byte函数里面的应该是.Charset = "UTF-8" 。我已经请版主 ...

谢谢.
不好意思,还有两个问题:
(1)charset的位置是有讲究吗?我看strtobyte函数的charset在write方法之前,而bytetostr函数的charset在write方法之后.
(2)以上两个函数的charset是否是指strtext编码?如果是,为什么不需要设置byte的编码.

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-25 10:40 | 显示全部楼层
onthetrip 发表于 2014-11-24 21:12
谢谢.
不好意思,还有两个问题:
(1)charset的位置是有讲究吗?我看strtobyte函数的charset在write方法之前 ...

       编码是针对文本而言的。因为计算机内部只能储存二进制数据,所以文本要储存在计算机里时,需要按照一个指定的规则转换为二进制数据。这个“指定的规则”就是编码。
       比如,“我”这个汉字,假如按照GB2312编码转为二进制数据,第一个字节是206,第二个字节是210;假如按照Unicode编码,第一个字节是98,第二个字节是17。

所以,用ado的stream对象在文本与二进制数据的转换中,charset需要在读出文本(ReadText)或写入文本(WriteText)之前设置,否则stream会按照默认的Unicode编码来读写文本。

stream对象里,
        Type必须设置在数据读写(Write、Read、WriteText、ReadText)之前,用于确定读写数据的类型;
       Charset必须设置在文本读写(WriteText、ReadText)之前,用于确定stream中文本的编码类型;
        Position必须设置在读出数据(Read、ReadText)之前,以确定读出数据的起始位置。
       Mode必须设置在流对象打开(Open)之前,以确定流文件的读写权限。在这些处理文本的自定义函数的stream里,默认值是adModeUnknown,所以这句不设置也可以的。
stream对象的更详细的用法,可以参考access帮助里的ado对象的帮助文档。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-25 20:38 | 显示全部楼层
本帖最后由 onthetrip 于 2014-11-25 20:47 编辑
wcymiss 发表于 2014-11-25 10:40
编码是针对文本而言的。因为计算机内部只能储存二进制数据,所以文本要储存在计算机里时,需要按照 ...

吴姐,很感谢您.您的讲解使我茅塞顿开啊,之前我看了无数遍的stream的帮助,怎么也没看懂.现在我的理解是这样的:
(1)strtobyte这个函数中,charset的设置是指定了最终输出的byte按什么形式的编码;这个编码基本可以随便设置;
(2)bytetostr这个函数中,charset的设置不能随便设置,而必须事先知道byte这个原始数据流是什么编码,其设置要跟其一致.
  1. Sub test()
  2. Dim arr() As Byte
  3. Dim brr() As Byte
  4. Dim crr() As Byte
  5. Dim StrTexta As String
  6. Dim StrTextb As String
  7. Dim StrTextc As String
  8. Const uCode As String = "Unicode"
  9. Const gCode As String = "GB2312"
  10. Const utCode As String = "UTF-8"
  11. Const s As String = "我"
  12. arr = StrToByte(s, uCode)
  13. brr = StrConv(s, vbFromUnicode)
  14. crr = StrConv(s, vbUnicode)
  15. StrTexta = ByteToStr(arr, uCode)
  16. StrTextb = ByteToStr(brr, gCode)
  17. StrTextc = ByteToStr(crr, uCode)
  18. Stop
  19. End Sub
复制代码
很感激你这样的高手还能耐心地给我普及这些基础知识.
为啥上面代码中的StrTextc转不回来了呢,这个话题貌似已经偏离这个帖子的主题了:)


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-26 08:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
onthetrip 发表于 2014-11-25 20:38
吴姐,很感谢您.您的讲解使我茅塞顿开啊,之前我看了无数遍的stream的帮助,怎么也没看懂.现在我的理解是这样 ...

StrConv的转码规则是系统默认的编码(ANSI),对于中国大陆地区,一般是GB*编码(GB2312、GBK等等),对于台湾地区,则是BIG5编码。这个可以在strconv函数的第三参数里设置。

在VBA里,文本是按照Unicode的编码形式储存的,也就是说,直接把文本赋值给Byte数组的话,相当于StrToByte(s,"Unicode")函数的效果(需去除Bom头)。

所以,对于VBA代码:C = StrConv(A, B)  ,对于不同的变量类型,它会有以下几种不同的效果:
strconv.png

由上表看出,StrConv函数,第二参数是vbFromUnicode时,是用来把文本按GB2312编码转换为二进制数据的,而是vbUnicode时,是用来把二进制数据按GB2312转换为文本的。如果参数类型不符合这样的要求,系统就会自动再按Unicode编码进行转换。这样就很有可能会达不到预期效果。

stream对象将文本按照Unicode、UTF-8编码转换为二进制数据时,会在前面加上2-3个字节的Bom头。为了让StrToByte函数与StrConv函数的结果保持一致,修改自定义函数StrToByte如下:

  1. Function StrToByte(strText As String, strCharset As String, Optional Bom As Boolean = False)
  2.     With CreateObject("adodb.stream")
  3.         .Type = 2 'adTypeText
  4.         .Charset = strCharset
  5.         .Open
  6.         .Writetext strText
  7.         .Position = 0
  8.         .Type = 1 'adTypeBinary
  9.         If Not Bom Then
  10.             If LCase(strCharset) = "unicode" Then
  11.                 .Position = 2
  12.             ElseIf LCase(strCharset) = "utf-8" Then
  13.                 .Position = 3
  14.             End If
  15.         End If
  16.         StrToByte = .Read
  17.     End With
  18. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-26 12:26 | 显示全部楼层
本帖最后由 onthetrip 于 2014-11-26 12:50 编辑
wcymiss 发表于 2014-11-26 08:54
StrConv的转码规则是系统默认的编码(ANSI),对于中国大陆地区,一般是GB*编码(GB2312、GBK等等),对于 ...
由上表看出,StrConv函数,第二参数是vbFromUnicode时,是用来把文本按GB2312编码转换为二进制数据的,而是vbUnicode时,是用来把二进制数据按GB2312转换为文本的。如果参数类型不符合这样的要求,系统就会自动再按Unicode编码进行转换。这样就很有可能会达不到预期效果。

太精彩了,终于全面理解了StrConv的潜在规则.尤其是这段话:"由上表看出,StrConv函数,第二参数是vbFromUnicode时,是用来把文本按GB2312编码转换为二进制数据的,而是vbUnicode时,是用来把二进制数据按GB2312转换为文本的。如果参数类型不符合这样的要求,系统就会自动再按Unicode编码进行转换。这样就很有可能会达不到预期效果。"
醍醐灌顶!
帮助中就提到了一个缺省码页,百度以后只知道是GB2312,还是摸不着头脑,原来是GB2312格式的byte()数组.如果参数类型不符合这样的要求,有可能达不到预期效果!我代码中StrTextc转不回来就是参数类型不符合要求
感谢!

TA的精华主题

TA的得分主题

发表于 2014-11-26 15:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wcymiss 发表于 2014-11-24 20:46
(1)、(2)、晕的。那是我写错了。StrToUTF8Byte函数里面的应该是.Charset = "UTF-8" 。我已经请版主 ...

吴老师,我尝试登陆这个图书网,可就是登陆不上,我看好像也没有加密呀 http://www.rtshutu.com/basedata/ ... =1ad691ca0000cc0bce
图书.rar (13.22 KB, 下载次数: 18)
吴老师您有空帮我看看,谢谢

点评

有验证码  发表于 2014-11-26 15:46

TA的精华主题

TA的得分主题

发表于 2014-11-26 16:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wcymiss 发表于 2014-11-26 08:54
StrConv的转码规则是系统默认的编码(ANSI),对于中国大陆地区,一般是GB*编码(GB2312、GBK等等),对于 ...

我附件里面,已经加入了验证码,还是不行,不知道是不是cookie中会不会有动态参数,可我看了,感觉都不是

TA的精华主题

TA的得分主题

发表于 2014-11-26 19:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
suwenkai 发表于 2014-10-21 22:18
第一题

大师,帮我抓一下有单选框的数据,谢谢啦
http://guess.win007.com/users/basket/userguess.aspx?u=1039035
把这3个单选框里的胜负场次还有胜率同时抓下来

点评

不要做伸手党。自己看帖学习抓包  发表于 2014-11-26 19:57

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-26 20:08 | 显示全部楼层
renahu 发表于 2014-11-26 16:56
我附件里面,已经加入了验证码,还是不行,不知道是不是cookie中会不会有动态参数,可我看了,感觉都不是

SendData里少了两个参数:
&ctl00%24ContentPlaceHolder1%24ImageButton1.x=117'数字在某个范围里可以任意
&ctl00%24ContentPlaceHolder1%24ImageButton1.y=16‘数字在某个范围里可以任意
这两个参数是鼠标点击“登录”按钮时坐标。

另外,xmlhttp是不支持setRequest "cookie"和"referer"的。

还有,测试的时候参数不要删减,成功之后再考虑删减参数。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-24 21:15 , Processed in 0.038228 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表