ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-5 13:32 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
认真看了wcymiss 大神强大的帖子,感觉很系统很全面。以前抓取过不少网站,也都没啥问题,没想到最近卡在winhttp这里了,连首页获取的数据都拿不回来,真是郁闷死了!希望大神有空了能给指点一下!俺卡在大门口好几天了……
     
Set winhttp = CreateObject("winhttp.winhttprequest.5.1") 'Set winhttp = CreateObject("MSXML2.XMLHTTP") 这样的话就没问题,
          '但是就无法设置refer链接了,因此必须用winhttp
     With winhttp
         .Open "GET", "http://www.pss-system.gov.cn/sipopublicsearch/portal/index.shtml", False         '没错,就是这个网,首页都不给winhttp明文看啊……
        .SetRequestHeader "Connection", "Keep-Alive"
        .SetRequestHeader "Accept-Language", "en-US"
        .SetRequestHeader "Accept", "text/html, application/xhtml+xml, */*"
        .SetRequestHeader "User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"
        .SetRequestHeader "Accept-Encoding", "sdch" '这里换deflate什么的都试遍了,无论我发什么,服务器一定以gzip格式发回数据
         .send
         debug.print .responseBody       '这里用.responseText会给个系统错误,提示“运行时错误,在多字节的目标代码页中,没有此Unicode字符可以映射到的字符”
这里得到的.responseBody是以gzip格式压缩的,用winrar解压后可以看到主页的文本,但是winhttp这个货不认识,虽然XMLHTTP不用解压识别都毫无压力,但是它不能伪造refer。好吧,开始在论坛里百度里狂搜gzip解压,各种折腾,发现没有适合我的系统的gzip.dll,谁让我是win7 64位系统呢?
      在搜索的过程中,发现这些问题各路大神都曾提到过,可惜都是一句而过……

TA的精华主题

TA的得分主题

发表于 2015-3-5 13:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
其实我是一直用的Microsoft.XMLHTTP,奈何最后到了提取关键数据的时候才发现,系统死活不给关键数据,虽然我模拟代码里明明写了referer的,而且XMLHTTP也不提示出错,抓包才发现我的包里没有referer,这才老老实实回头用winhttprequest.5.1,谁知道这货如此难用……人家XMLHTTP的返回文本随便打印随便分割,这货……

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-5 16:27 | 显示全部楼层
这个问题我遇到过1次,你这里是第二次。

除了用api去解压缩gzip数据,我还没想出其他什么办法。

但你的系统没法运行那些api?。。。。

如果只是你自己操作,你可以打开fiddler,在代码里对winhttp对象里设置代理(.setProxy 2, "127.0.0.1:8888"),这样,代码运行时fiddler会帮你解压缩gzip数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-5 16:34 | 显示全部楼层
amour0861 发表于 2015-3-5 13:32
认真看了wcymiss 大神强大的帖子,感觉很系统很全面。以前抓取过不少网站,也都没啥问题,没想到最近卡在wi ...

或许,你可以参考msdn,修改下相应的api

TA的精华主题

TA的得分主题

发表于 2015-3-5 16:51 | 显示全部楼层
wcymiss 发表于 2015-3-5 16:34
或许,你可以参考msdn,修改下相应的api

感谢大神回复,修改API神马的太吓人了……我最后找到的办法是换C#。

关键代码:
          HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream streamReceive = resp.GetResponseStream();
                Encoding encoding = Encoding.GetEncoding("utf-8");
                GZipStream gzip = new GZipStream(streamReceive, CompressionMode.Decompress);
                using (StreamReader reader = new StreamReader(gzip, encoding))
                {
                    Console.Write(reader.ReadToEnd());
                }

TA的精华主题

TA的得分主题

发表于 2015-3-5 16:55 | 显示全部楼层
wcymiss 发表于 2015-3-5 16:27
这个问题我遇到过1次,你这里是第二次。

除了用api去解压缩gzip数据,我还没想出其他什么办法。

API试过,除了gzip.dll(我找遍了,win7 64位的没法用),还有别的库里有gzip的解压接口么?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-6 09:53 | 显示全部楼层
本帖最后由 wcymiss 于 2015-3-9 17:07 编辑
amour0861 发表于 2015-3-5 16:55
API试过,除了gzip.dll(我找遍了,win7 64位的没法用),还有别的库里有gzip的解压接口么?


以下代码在 64位win7旗舰版、32位office2010里运行通过:
(gzip.dll如果不解压至windows\system32\文件夹,在api的声明中写明路径即可,如:Declare Function InitDecompression Lib "d:\gzip.dll" () As Long)

Gzip测试.rar (26.66 KB, 下载次数: 286)

=============2015-03-09更新======================
上面附件有错误。详见726楼。

点评

错的,不要从百度抄!  发表于 2015-3-8 00:11

TA的精华主题

TA的得分主题

发表于 2015-3-6 10:14 | 显示全部楼层
wcymiss 发表于 2015-3-6 09:53
以下代码在 64位win7旗舰版、32位office2010里运行通过:
(gzip.dll如果不解压至windows\system32\文件 ...

太感谢了!您真是大神!这个库我在论坛也搜到过,但是用的时候BufferSize总是为一个负值,出错用不了,太感谢您了!虽然用c#也可以做,但是用熟悉的vba感觉真是太好了!

TA的精华主题

TA的得分主题

发表于 2015-3-6 17:20 | 显示全部楼层
本帖最后由 lolmuta 于 2015-3-6 17:23 编辑

网抓不只是网抓而已,一般人都只想到要去取资料…
而且只要是网站其实都不希望有爬虫来占流量…

我要说的是关于公司的系统,
通常规模较大的公司,都会用一些系统来来控制货品的状况,
而且都网路化了,可以用Browser直接操作,但
但是若是系统不好用,而那一块用的人又不多,导致于所提的改善需求就无限延期
而且有些需求也不太好意思说要这样改,因为又不是只有你一个人用,
都只能在脑补,而且以前不懂(就只懂IE法),老是卡在认证那关,望着认证出来的html干瞪眼,
而且修改系统的东西总是比较大的工程,


但现在这个网抓,可以在不修改动系统的情况下,
制定我想要的操作介面方式,只要提交模拟正确。

一键解货,一键hold 货,一键加注注解…

这真的是太神奇了…



TA的精华主题

TA的得分主题

发表于 2015-3-8 00:10 | 显示全部楼层
本帖最后由 liucqa 于 2015-3-8 00:12 编辑
wcymiss 发表于 2015-3-6 09:53
以下代码在 64位win7旗舰版、32位office2010里运行通过:
(gzip.dll如果不解压至windows\system32\文件 ...

你这个代码是错的,建议看一下gzip的文件格式定义,然后再自己改一下代码。

不要从百度抄,全是错的。以前蓝天给过代码,也是抄百度的,都是错的!

你这个代码某些情况下会导致excel失去响应崩溃 ---- ---- 其实是发生了内存越界。

我前几年就被百度来的代码坑过了

欢迎你进坑,哈哈哈!!!

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 14:41 , Processed in 0.048072 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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