ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

   
高效办公必会的Office实战技巧 永久免费,网表让Excel秒变数据库 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! 国内首部Excel函数公式学习大典 职场充电黑科技, Office微视频教程 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 突破Excel限制,用活字格提高效率 12门Excel免费公开课任你学
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 免费的Excel考勤计算系统
查看: 232757|回复: 1296

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-21 11:12 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 wcymiss 于 2014-11-1 09:24 编辑

本帖主要针对的是不懂html的网抓新手,所以,本帖基本不谈原理,只说实战

学网抓对vba的要求:
1、了解对象及对象属性方法的基本概念;
2、熟练使用循环、判断及vba数组;
3、掌握一种以上提取文本的方法,可以在各种有规律的文本里提取所需数据;
4、会调试代码,会用立即窗口、本地窗口。(很重要,请务必学会)
5、有录制宏的经验。

可以这样说,只要你具备上述vba知识,再对网抓有点兴趣,有点耐心,那你就能学会网抓。

我本人开始用xmlhttp和fiddler的时候,对html和javascript是一窍不通的,对get、post也不懂,全是依样画葫芦。画成功后,有了兴趣,才慢慢去寻找它的原理和相关知识去学习。我想我这样的学习方法或许可以给一些像我一样的小白一个借鉴。但愿没有误导新人才好。

学习html强力推荐此网站:http://www.w3school.com.cn/ ,绝对权威

==================================================
如果发觉楼主有写错的地方,或是用错术语,或是概念模糊,或是运行出错、运行效果与楼主不同,或是有看不懂、不理解的地方,请大家及时提出来。
希望在大家的帮助和建议下完善本帖,让不会网抓的朋友由此贴学会写一些基础的网抓代码,同时感受到网抓的乐趣。

谢谢大家!



补充内容 (2014-11-5 19:37):
交流QQ群:310731499

评分

参与人数 45财富 +300 鲜花 +89 技术 +3 微积分 +10 收起 理由
autumnalRain + 3 优秀作品
全日爱123 + 2 感谢帮助
weiyingde + 3 优秀作品
orientson + 2 优秀作品
wuliaolang + 2 感谢您的作品

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-25 10:43 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-27 13:07 编辑

处理table
table数据处理,除了之前的两种通用方法外,还有以下几种方法:

1、html法
   将table数据写入htmldocument对象,然后循环取出表格的各个元素。
   优点:可以利用htmldocument对象整理表格。
   缺点:需要学习html相关知识。
   以17楼作业二为例:
  1. Sub Main()
  2.     Dim strText As String
  3.     Dim arrData(1 To 1000, 1 To 3)
  4.     Dim i As Long, j As Long
  5.     Dim TR As Object, TD As Object
  6.    
  7.     With CreateObject("MSXML2.XMLHTTP")
  8.         .Open "POST", "http://www.pinble.com/Template/WebService1.asmx/Present3DList", False
  9.         .setRequestHeader "Content-Type", "application/json"
  10.         .Send "{pageindex:'1',lottory:'TC7XCData_jiangS',pl3:'',name:'江苏七星彩',isgp: '0'}"
  11.         strText = Split(JSEval(.responsetext), "<script")(0) '本例的script运行会提示错误,所以去除这部分script代码
  12.     End With
  13.    
  14.     With CreateObject("htmlfile")
  15.         .write strText
  16.         i = 0
  17.         For Each TR In .all.tags("table")(2).Rows
  18.             i = i + 1
  19.             j = 0
  20.             For Each TD In TR.Cells
  21.                 j = j + 1
  22.                 arrData(i, j) = TD.innerText
  23.             Next
  24.         Next
  25.     End With
  26.    
  27.     Set TR = Nothing
  28.     Set TD = Nothing
  29.     Cells.Clear
  30.     Range("C:C").NumberFormat = "@" '设置文本格式以显示数字前面的0
  31.     Range("a1").Resize(i, 3).Value = arrData
  32. End Sub

  33. Function JSEval(s As String) As String
  34.     With CreateObject("MSScriptControl.ScriptControl")
  35.         .Language = "javascript"
  36.         JSEval = .Eval(s)
  37.     End With
  38. End Function
复制代码
2、QueryTable法:
   这个是excel自带的网抓利器。个人觉得它最大的优势就是处理table很方便。
   优点:处理table方便,代码简短。
   缺点:会产生定义名称。多页循环时每页都会产生行字段名称,需要后续处理删除。
   仍以作业一的第1题为例:
  1. Sub Main()
  2.     Cells.Delete
  3.     With ActiveSheet.QueryTables.Add("url;http://data.bank.hexun.com/lccp/jrxp.aspx", Range("a1"))
  4.         .WebFormatting = xlWebFormattingNone '不包含格式
  5.         .WebSelectionType = xlSpecifiedTables '指定table模式
  6.         .WebTables = "2" '第2张table
  7.         .Refresh False
  8.     End With
  9. End Sub
复制代码
代码相当简短。


3、复制粘贴法:
   table部分的文字可以直接复制到单元格内,且保留数据原格式。
   优点:只需取出table部分,不需分析数据内部结构。代码编写简便。
   缺点:有时格式反而是累赘。
  1. Sub Main()
  2.     Dim strText As String
  3.     With CreateObject("MSXML2.XMLHTTP")
  4.         .Open "GET", "http://data.bank.hexun.com/lccp/jrxp.aspx", False
  5.         .Send
  6.         strText = .responsetext
  7.     End With
  8.     strText = "<table" & Split(Split(strText, "<table")(2), "</table>")(0) & "</table>"
  9.     CopyToClipbox strText
  10.     Cells.Clear
  11.     Range("a1").Select
  12.     ActiveSheet.Paste
  13. End Sub

  14. Sub CopyToClipbox(strText As String)
  15.     '文本拷贝到剪贴板
  16.     With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  17.         .SetText strText
  18.         .PutInClipboard
  19.     End With
  20. End Sub
复制代码
小贴士:
点击Fiddler的Response框的WebView按钮可以看到HTML代码在网页上的显示效果。

评分

参与人数 2鲜花 +3 收起 理由
740688321 + 1 优秀作品
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 11:15 | 显示全部楼层
本帖最后由 wcymiss 于 2014-11-3 11:22 编辑

目录:

一、前期准备:
  1、fiddler的安装、设置、使用;
        Fiddler抓包并确认数据页面一例
  2、常用代码和自定义函数。

二、获取数据:
  1、直接获取:
    a、GET;
         作业一
    b、POST;
        作业二
    c、静态参数;
    d、转码
  2、防盗链的处理:
    a、模拟Referer;
    b、模拟Cookie;
        继续唠叨Cookie--例子暂缺
        还是Cookie-----模拟Cookie欺骗服务器一例
        作业三
    c、模拟User-Agent ;
    d、其他发包头的模拟;
    e、动态参数
      动态参数又一例
      抓取QQ群成员清单
      用IE获取Cookie

对获取数据作个小结

  3、其他
    a、缓存的困扰;
    b、重定向;
    c、代理

三、提取数据:
  1、下载文件;
  2、转码;
  3、处理数据的通用方法
  4、处理table
  5、处理xml
  6、处理JSON
    a、初识JSON
    b、JSON转换成vba对象
    c、编写JavaScript代码处理JSON(一)
    d、编写JavaScript代码处理JSON(二)
    作业四

四、发送数据
  1、登录;
    a、初识登录(以登录163邮箱为例)
    b、登录之后可以做什么----查询数据
    c、登录之后可以做什么----发送数据
    d、复杂登录前言
    e、复杂登录一:搜房网登录
    f、复杂登录二:58同城登录

  2、上传文件

点评

“Fiddler抓取法”  发表于 2014-10-23 13:02
比我习惯好,我想到哪写到哪,代码也是慢慢发展的,所以都没法事先弄个目录  发表于 2014-10-22 19:22

评分

参与人数 14鲜花 +28 收起 理由
lengyff + 2 太强大了
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。
jinbinghao + 2 太强大了,最重要的是讲的还好!
Rodevo + 2 太强大了
lover2008 + 2 太强大了

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 11:25 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-31 10:36 编辑

vba网抓常用方法:

1、xmlhttp/winhttp法:
用xmlhttp/winhttp模拟向服务器发送请求,接收服务器返回的数据。
优点:效率高,基本无兼容性问题。
缺点:需要借助如fiddler的工具来模拟http请求。

2、IE/webbrowser法:
创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
优点:这个方法可以模拟大部分的浏览器操作。所见即所得,浏览器能看到的数据就能用代码获取。
缺点:各种弹窗相当烦人,兼容性也确实是个很伤脑筋的问题。上传文件在IE里根本无法实现。(有实现方法?请一定告诉我)

3、QueryTables法:
因为它是excel自带,所以勉强也算是一种方法。其实此法和xmlhttp类似,也是GET或POST方式发送请求,然后得到服务器的response返回到单元格内。
优点:excel自带,可以通过录制宏得到代码,处理table很方便。代码简短,适合快速获取一些存在于源代码的table里的数据。
缺点:无法模拟referer等发包头(如果你有在QT中模拟referer的方法,请一定告诉我)

本帖主要讲述的是第一种方法。

评分

参与人数 6鲜花 +13 收起 理由
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。
335081548 + 2 值得肯定
JLxiangwei + 2 优秀作品
fxl447098457 + 2 优秀作品
xmyjk + 3 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 11:33 | 显示全部楼层
个人偏爱fiddler的原因:(唠叨话,可略过)

1、fiddler不需要寄生在浏览器中,且可抓到多个浏览器的包。
2、除了抓浏览器,一些联网的软件的请求数据过程也能抓到。如QQ。(据说网游也可以,不过我没试过)
3、fiddler还能记录vba代码运行时的数据请求过程。
4、界面清晰,查找数据方便。更有json、xml、javascript各种数据格式化的插件。
5、还可以手工在fiddler里模拟发包,获取数据,方便测试。

评分

参与人数 5鲜花 +14 收起 理由
wuzaijin2012 + 2 优秀作品
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。
ghostjiao + 2 优秀作品
liuguansky + 5 优秀作品
xmyjk + 3 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 11:40 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 11:45 | 显示全部楼层
fiddler的安装、设置、使用
安装:
下载链接:http://w.x.baidu.com/alading/anquan_soft_down_normal/10963安装了.Net Framework后才能安装fiddler。如果系统没有安装.Net Framework,在fiddler的安装中会提示下载安装。

设置:
1、菜单栏:Rules,勾选“Remove all Encodings”(解密所有加密数据)(很重要,否则之后会出现查找不到特征数据的情形)
2、菜单栏:Rule,勾选"Hide Image Requests"(隐藏图片包)、"Hide CONNECTs"(隐藏CONNECTs包)
fiddler设置1.png

3、菜单栏:Tools-Fidder Options-HTTPS,勾选"Capure HTTPS CONNECTs"、"Decrypt HTTPS traffic"、"Ignore server certificate
errors"。(获取https包并忽略信任错误)
fiddler设置2.png


使用:
fiddler抓包有点类似excel里的录制宏。

抓包步骤如下:
1、为确保fiddler抓到完整的数据包,抓包前请手动清除浏览器cookie、缓存及历史记录。
不要用fiddler上的按钮“Clear Cache ” ,这个按钮只能清除IE浏览器的缓存。
2、打开fiddler,然后打开浏览器,输入网址,在网页里做所需操作。操作完毕后,进入fiddler,fiddler的左半边框框内的数据就是抓到的包。为了fiddler不受之后网页操作的影响,可以点击左下方的"Capturing"按钮停止fiddler抓包。

fiddler抓包界面简单解析:
1、左边的是session框,选择该框任意一条数据,右边菜单选择“Inspectors”后出现上下两个框:上边是Request,包含所有的发送请求;下方是Response,包含所有服务器响应请求后返回的内容。
fiddler界面1.png

2、查找数据:
抓到包后,session框里的数据太多,如何找到我们需要的呢?
a、在fiddler里按ctrl+F,搜索所需某个比较有特征的数据,搜到后点击该session,Request框和Response框都选择“Raw”菜单。
搜索框内可以选择搜索范围。
fiddler搜索框.png

b、在Response框下方的空白长条框里,输入之前搜索的那个特征数据,按回车,确认其是否存在于该Response内,如果存在,再查看上下文,确认是否是所需的数据页面。
这步很重要,如果数据页面确认错了,接下来就都是做无用功了。

3、数据页面确认后,我们写代码要模拟的就是Request框中的数据。

小贴士:
特征字符尽量不要选择中文,中文可能会有转码;也尽量不要选择带格式的文本。带格式的文本通常含有html代码。这些都有可能出现搜索不到数据的情形。




补充内容 (2015-1-9 12:58):
下载链接错了,那个是下载的更新。官网下载链接是这个:http://www.telerik.com/download/fiddler/fiddler4。你也可以百度搜索下载。

点评

额,下载链接打不开,显示为:无法显示该网页  发表于 2014-11-4 14:52
,跟着贴慢慢学习吧,不做蛋糕了吗?原教程文件发我下可以不?  发表于 2014-10-23 15:51

评分

参与人数 7鲜花 +15 收起 理由
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。
brightred + 2 优秀作品
念一环 + 2 优秀作品
335081548 + 2 太强大了
JLxiangwei + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 11:49 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 12:47 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-21 12:54 编辑

Fiddler抓包并确认数据页面一例:

网站:http://www.cffex.com.cn/fzjy/tjsj/pztj/
操作:点击“品种日数据统计”,在日期起始框内选择2014-10-01,在日期截止框内输入今天日期,点击“查询”,随后出现的表格为所需数据。
fiddler搜索一例.png

Fiddler操作:
1、清除浏览器cookie、缓存、历史记录。
2、打开fiddler,打开浏览器,输入网址进行操作。
3、选择数据中某一段数字作为特征字符串在fiddler里进行查找。
fiddler搜索一例2.png

fiddler搜索一例3.png

4、找到后确认是否是所需数据页面。
fiddler搜索一例4.png


IF  搜索成功 Then
     继续往下看。。。
Else
     重新按照上述步骤抓包
End IF

评分

参与人数 6鲜花 +12 收起 理由
周星骋 + 2 平生不识wcymiss,纵称英雄也枉然。
zhao蓝 + 2 太强大了
念一环 + 2 优秀作品
335081548 + 2 优秀作品
ghostjiao + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 12:51 | 显示全部楼层
更多Fiddler的使用方法,敬请参考《Fiddler调试权威指南》一书。
电子书下载地址:http://pan.baidu.com/s/1CRctw

我昨天才发现有这本书,赶紧收藏,还没来得及看

TA的精华主题

TA的得分主题

发表于 2014-10-21 12:52 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

关注官方微信,每天坐享新鲜教程

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

GMT+8, 2017-11-24 19:00 , Processed in 0.099639 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.3

© 2001-2017 Wooffice Inc.

   

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

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

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