VBA网抓教程总结.docx

上传人:夺命阿水 文档编号:118048 上传时间:2022-12-19 格式:DOCX 页数:74 大小:1.05MB
返回 下载 相关 举报
VBA网抓教程总结.docx_第1页
第1页 / 共74页
VBA网抓教程总结.docx_第2页
第2页 / 共74页
VBA网抓教程总结.docx_第3页
第3页 / 共74页
VBA网抓教程总结.docx_第4页
第4页 / 共74页
VBA网抓教程总结.docx_第5页
第5页 / 共74页
点击查看更多>>
资源描述

《VBA网抓教程总结.docx》由会员分享,可在线阅读,更多相关《VBA网抓教程总结.docx(74页珍藏版)》请在课桌文档上搜索。

1、前言vba网抓常用方法:1、Xm1.httPwinhttp法:用m1.httpwinhttp模拟向服务器发送请求,接收服务器返回的数据。优点:效率高,基本无兼容性问题。缺点:需要借助如fidd1.er的工具来模拟http请求。2、IEwebbrowseri:创建IE控件或WebbroWSer控件,结合Hm1.fi1.e对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。优点:这个方法可以模拟大部分的浏览器操作。所见即所得,浏览器能看到的数据就能用代码获取。缺点:各种弹窗相当烦人,兼容性也确实是个很伤脑筋的问题。上传文件在IE里根本无法实现。(有实现方法?请一定告诉我)3、QUeryTabI

2、eS法:因为它是exce1.自带,所以勉强也算是一种方法。其实此法和Xm1.httP类似,也是GET或PoST方式发送请求,然后得到服务器的response返回到单元格内。优点:exce1.自带,可以通过录制宏得到代码,处理tab1.e很方便。代码简短,适合快速获取一些存在于源代码的tab1.e里的数据。缺点:无法模拟referer等发包头(如果你有在QT中模拟referer的方法,请一定告诉我)本文主要讲的是第一种方法1、前期准备工作1.Ifidd1.er网抓工具的安装、设置、使用设置:1、菜单栏:RU1.eS,勾选“Removea1.1.Encodings”(解密所有加密数据)(很重要,否

3、则之后会出现查找不到特征数据的情形)2、菜单栏:RUe勾选HideImageReqUeStS”(降藏图片包)、HideCONNECTS”(隐藏CONNEeTS包)FFidd1.erebDebugger3、菜单栏:TOOIS-FidderOPtiOnS-HTTPS,勾选“CaPUreHTTPSCONNECTs、DecryptHTTPStrafficIgnoreservercertificateerrorso(获取https包并忽略信任错误),/Fidd1.ercbDebueeerFi1.eEdit Rul: I ;4 RePIay XToo1.sVifH1.p 册 Fiddler GoEdgJi

4、dd1.erOptionsVinIMZTOptions.C1.erIfinI皿 Cache CtrBShiftlClr YinIMTT CookiesTixt1.fizardCopreSessioxisCtr1.4ECtrl”RsetScriptSandboxVitwIE CtchtIPSIS 1.llsession Any Process 柏 Find 显 SaVe -: Bxovse - Clear Cache/AutoResporxjef M Composef 向 FidcfefSaiPt Fi1.ers . Iil Log . = Timee使用:fidd1.er抓包有点类似exce1

5、.里的录制宏。抓包步骤如下:1、为确保fidd1.er抓到完整的数据包,抓包前请手动清除浏览器cookie、缓存及历史记录。不要用fidd1.er上的按钮“C1.earCache,这个按钮只能清除IE浏览器的缓存。2、打开fidd1.er,然后打开浏览器,输入网址,在网页里做所需操作。操作完毕后,进入fidd1.er,fidd1.er的左半边框框内的数据就是抓到的包。为了fidd1.er不受之后网页操作的影响,可以点击左下方的Capturing按钮停止fidd1.er抓包。fidd1.er抓包界面简单解析:1、左边的是session框,选择该框任意一条数据,右边菜单选择Inspectors”后

6、出现上下两个框:上边是ReqUeS3包含所有的发送请求;下方是ReSPonse,包含所有服务器响应请求后返回的内容。口回区R.Protoco1.Host304HIlPdub.excehome.304HTTPdub.excehome.304HTTPdub.excehome.304HTTPdub.excehome.2HTTP304HTTPdup.badustabc.304HTTP304HTTPdub.excehome.304HTTPdub.excehome.304HTTPdub.excehome.304HTTPtcss.qq.m200HTTPdub.excehome.200HTTPdub.exce

7、home.304HTTPdub.excehome.302HTTPbq.soso.m舱专司On檀黑:黑HTTPpb.sogou.mHTTPHTTPHTTPdub.excehome.HTTPpos.badu.mHTTPdup.baidsttic.HTTPdup.badustabc.HTTPHTTPHTTPpos.baidu.mHTTPpos.baidu.mHTTPHTTPdub.excehome.KditBu1.es tools Yiev HelP 册 Fiddler I二 GoZd Go Strew-6789n2122262728293031323438394042444548495051s25

8、45556575Caotunna - A1. ProcessesHeXUcTextvtew Sntaxw , WebForms HeAtew Auth Coes1.RwJSON , XMLGET httpcl ub. excel home. net/home. php?mod=spacec&ac=pm&op=CheCkneWPmrand= Accept: *Referer: http:clyb.excelhoReqUeSt 框Cl. IL,ViewinNotcoad ,ansTner Hers Svntaxview TmageVfew , WxVfe* WVte/ , AWr , TaemgR

9、art- JSON XMCdowes ,HTTP/1.1 200 OKContent-Type: text/html; charset=gbkVary: Accept-EncodingServer: Microsoft-IIS/7. SX-Powered-By: PHP/5.3.27Set-Cookie: 5WOj_b676_lastact=1413864033%09home.php%09spacecp; expires=Wed, Set-Cookie: 5wOj_b676_connect_is_bind=O; expires=wed, 21-0ct-2015 04:00:33 Q Set-C

10、ookie: 5WOj_b676_stats_qc_reg=deleted; expires=Thu, 01-Jan-1970 00:00:0 Set-Cookie: 5W0j_b676_cloudstatost=deleted; exires=hu, 01-Jan-1970 00:00:1 Set-Cookie: 5W0j_b676_checkpm=l; expires=Tue. 21-0ct-2014 04:01:03 GMT; path Date: Tue, 21 Oct 2014 04:00:33 GMTContent-Length: 0ResponseYEIrYegJI Keep:A

11、1.l sessions AnydbStotst / InspectorsProcess丹 Find 尽 SaVe ; .) Browse 欲CIeaX CacheAUtoReSPOnder M Composer J M RddkrSopt i 口 Fiters 3 1.og m Trndrc1/35httD:/ 14138640322、查找数据:抓到包后,SeSSion框里的数据太多,如何找到我们需要的呢?a在fidd1.er里按ctrl+F,搜索所需某个比较有特征的数据,搜到后点击该session*Request框和Response 框都选择“Raw 菜单。搜索框内可以选择搜索范围。Fin

12、dSeSSionSHnd:OptionsSearch:Dcamine:口Match caseRequestsand responsesHeaders and bodies口Regu1.ar pression口Search b,inaries口 D,ecode compressed content口 Search o,n1.y selected sessions口 Select rnatches 回 IJnmark old resultsResult Highlight: Yellow _, vCance1.b、在Response框下方的空白长条框里,输入之前搜索的那个特征数据,按回车,确认其是

13、否存在于该ReSPonSe内,如果存在,再查看上下文,确认是否是所需的数据页面。Fidd1.erebDebugger这步很重要,如果数据页面确认错了,接下来就都是做无用功了。3、数据页面确认后,我们写代码要模拟的就是ReqUeSt框中的数据。小贴士:特征字符尽量不要选择中文,中文可能会有转码;也尽量不要选择带格式的文本。带格式的文本通常含有Hm1.代码。这些都有可能出现搜索不到数据的情形。1.2常用代码及自定义函数1.2.1 网抓主体代码1. SubMain()2. DimStrTextAsString3. WithCreate0bject(MSXM1.2.XM1.HP),CreateObje

14、ct(,WinHttp.WinHttpRequest.5.1)4. .OpenPOST,m,Fa1.se5. .SetRequestHeaderContent-Type,app1.ication/x-www-form-ur1.encoded6. .SetRequestHeaderRefererz,7. .Send8. StrText=.responsetext9. Debug-PrintStrText10. EndWith11. EndSubXm1.httPwinhttp对象的属性和方法可以网上百度学习(不学也暂时影响不大),内容不多。1.2.2 Javascript表达式求值1. Funct

15、ionJSEvaIfstrTextAsString)AsString2. WithCreateObject(MSScriptContro1.ScriptContro,)3. .1.anguage=javascript4. JSEvaI=.EvaI(StrText)5. EndWith6. EndFunction1.2.3 ur1.转码1. FunctionencodeURI(strTextAsString)AsString2. WithCreateObject(,msscriptcontro1.scriptcontro)3. .1.anguage=JavaScript4. encodeURI=

16、.Eva1.(encodeURIComponent(,&StrText&);)5. EndWith6. EndFunctionjavascript提供了六个转码函数:escape*unescape,encodeURIencodeURIComponent,decodeUR1.decodeURIComponent具体用法请百度。我只能说我最常用的是encodeRIComponento1.2.4 流数据转成指定编码的文本1. FunctionByteToStr(arrBytezStrCharsetAsString)AsString2. WithCreateObjectCAdodb.Stream)3.

17、 .Type=1,adTypeBinary4. .Open5. .WritearrByte6. .Position=O7. .Type=2,adTypeText8. .Charset=StrCharset9. ByteToStr=.Readtext10. .C1.ose11. EndWith12. EndFunction1.2.5 文本按指定编码转为流数据1. FunctionStrToByte(strTetAsString,StrCharsetAsString)2. WithCreatebject(adodb.stream)3. .Mode=3,adModeReadWrite4. .Type

18、=2,adTypeTet5. .Charset=StrCharset6. .Open7. .WritetextStrText8. .Position=O9. .Type=1,adTypeBinary10. .Position=2,保留BOM头则不需此行代码,去除三个字节的BOM头就填入3,去除两个字节的就填入211. StrToByte=.Read12. .C1.ose13. EndWith14. EndFunction注:某些文本转为流后,前面会添加几个字节的BoM头,用来被某些软件识别是什么编码。如UTF-8编码的前面有三个字节的BOM头,Unicode前面有两个字节的BOM头。大家可以视

19、情况选择保留或去除这些BOM头。1.2.6 二进制流转成文件1. SubByteToFiIefarrByte,StrFiIeNameAsString)2. WithCreateObjectCAdodb.Stream)3. .Type=1,adTypeBinary4. .Open5. .WritearrByte6. .SaveToFiIeStrFiIeName,2adSaveCreateOverWrite7. .C1.ose8. EndWith9. EndSub1.2.7 文本拷贝到剪贴板:1. SubCopyToCIipbo(strTetAsString)2. 文本拷贝到剪贴板3. WithC

20、reateObject(new1.C3B4210-F441-1.1.CE-B9EA-00AA006B1.A69)4. .SetTextStrText5. .Put1.nCIipboarcI6. EndWith7. EndSub先上这些,以后觉得有必要再添加突然想起HtmIWindow也可以直接执行Javascript函数得出值。用64位OffiCe的朋友可以测试一下下面的代码能不能通过:替代上面自定义函数2的:1. FunctionEvaIByHtmHstrTextAsString)AsString2. WithCreateObjectChtmIfiIe)3. .write4. EvaIByH

21、tmI=CaIIByNamef.parentwindow,eva1.,VbMethod7StrText)5. EndWith6. EndFunction替代上面自定义函数3的:1. FunctionencodeURIByHtm1.(strTetAsString)AsString2. WithCreatebject(,htm1.fi1.e)3. .write4. encodeURIByHtm1.=Ca1.1.ByName(.parentwindow,encodeURIComponent,VbMethod,StrText)5. EndWith6. EndFunction给DOm添加一个空的SCri

22、Pt就可以直接执行js函数了,非常好用。为防止Vba自动篡改大小写,把js函数名作为文本放在ca1.1.byname的参数里。1.3前期绑定就是先引用相关库比如MSXM1.2.XM1.HTTP,前期绑定方式步骤:在VBE编辑器中,选择工具栏工具引用,将弹出引用对话框。运行(S)IIf1.eD1.外/程序()S(W)帮助(H)_AJ引用-VBAProjectNicrosoftWindows Medi P1.ayer Heb . Nicrosoft Vindovs Medi4 PlAyer MeU Microsoft NlnHrTP Services, vrsi Microsoft WBI Scr

23、ipting VI.2 Libraj Microsoft Word 14. 0 Object Library Microsoft WSNAN Autonation VI. 0 Lil:st可使用的引用(A)NicrosoftJScriptIIicrosofteVsaI1.icrosof t_V“_Vb_C o deDORPr ocessorHNimeDir1.0Type1.Ibrary;r;TA*dA.PzhEi1T*v*TKvMicrosoftXM1.kv60定位:C.WindrsSyste32sxm1.6.d1.1.语言标准利用前期绑定后的代码如下:SubTest()DimXm1.AsNe

24、wMSXM1.2.XM1.HTTPWithxm1.OpenGET,UR1.7Fa1.se.sendEndWithEndSub稍加修改,即可变为后期绑定SubTest()Dimxm1.AsObject,原代码xm1.AsNewMSXM1.2.XM1.HTTPSetXm1.=CreateobjeCtrMSXM1.2.XM1.HTTP”)这句是后期绑定语句Withxm1.OpenGET,UR1.,Fa1.se.sendEndWithEndSub2、获取数据2.1 获取数据一直接获取2.1.1 获取数据一直接获取GET法再复制一次主体代码:1. SubMain()2. DimStrTextAsStri

25、ng3. WithCreateObject(,MSXM1.2.XM1.HTTP),CreateObject(WinHttp.WinHttpRequest.5.1)4. .OpenPOST,zFa1.se5. .SetRequestHeaderContent-Type,app1.ication-www-form-ur1.encoded6. .SetRequestHeader,Referer,z,7. .Send8. StrText=.responsetext9. Debug-PrintStrText10. EndWith11. EndSubXmIhttPwinhttp对象的OPen方法的第一参数

26、主要有两个值:GET和POSTo(必须大写)如何知道应该用GET还是PoST呢?很简单,看之前用fidd1.er的数据网页的ReqUeSt框RaW里的内容。Keep:A1.l sessions Any Process 免 Find Save () Browse 0Clear Cache(J)StabstKS :Si Inspectors 夕 AutoRes二 FPOSer 匹 F dd1.erSipt Filters Log =TimekneHead中STeXtVieWSyntaXVieW WebFormS HeXVieW AUth COOkjeS RaW JSON XM1.http:www.

27、 cf f ex. com, cnfzivt jsipzt i/PZrti2014index. xmx-requested-with:XM1.HttpRequestRHTTP/1.1Accept-1.anguage:zh-cnReferer: htfpJ/vyww.cff/Accept: application/xml, textml, i*Accept-Encoding: qzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0;.If-Modified-Since: Mon

28、, 20 Oct 2014 12:00:00 GMTIf-None-Match: la0f2-180e7-505d97440d000Host: WWConnection:Keep-A1.iveViewinNotepadRaW里是“GET”,所以我们代码也用GET,OPen方法的第二参数写入GET后面的Ur1.后面的SetReqUeStHeader语句暂且注释掉。这样代码就写好了:1. SubMain()2. DimStrTextAsString3. WithCreateObject(MSXM1.2.XM1.HP),CreateObject(,WinHttp.WinHttpRequest.5.1

29、)4. .OpenGET,5. ,.SetRequestHeaderContent-Type,app1.ication-www-form-ur1.encoded6. .SetRequestHeaderReferer,7. .Send8. StrText=.responsetext9. Debug-PrintStrText10. EndWith11. EndSub运行下,查看立即窗口的结果:20141020IF682608171091.001.201420141020TF54131.1733.00/1.V2014数据成功获取,本例是最直接的GET,不需添加SetReqUeStHeader。小贴土

30、:1:复制ReqUeSt框内的Ur1.时,为避免打开该链接,可以点击ReqUeSt框右下角的ViewinNotepad”按钮,从记事本内复制。2:ReSPonSeTeXt在Vba的立即窗口显示不全的原因是立即窗口只能容纳有限长度的文本。文本超长后,只能显示后面一部分的内容。2.1.2获取数据一直接获取POST法Open第一参数是POST的时候,Send方法一般会有参数。举例:网站:http:操作:第一行,“联赛选择”内选择英超,然后点击最右边的“确定”,获取该数据。用fidd1.er找到数据页面,查看Request框Raw里的内容:HeadersTextViewSyntaxViewWebFor

31、msHexViewAuthCOokjeSRaw-JSONXMIeoS立生上上汽08;?呼阴竺/5号154HTTP/1.1-Accept:1mageg1f,Image/jpeg,1ag,/pipeg,image/pjpeg,app1.ication/xam1.+xm1.,app1.ica1.Referer:http:/r:.zso6.7茄oddssearhAccept-1.anguage:zh-cn-User-Agent:Mozi1.1.a/4.0(compatib1.e;MSIE8.0;WindowsNT5.1;Trident/4.0;.NET4.0C;.Content-Type:app1.i

32、caton/x-www-form-ur1.encodedAccept-Encoding:gzip,def1.ateHost:Content-1.ength:104Connection:Keep-A1.ivePragma:no-cacheCookie:Aspsessionidcsbqqadc=Jnpfmkoceh1.mkeiojdfm1.dbitype=2&CompanyID=1.1.%7C%E6%BE%B3%E9%97%A8&1.eagueID=36&teaniID=0&kind=1.&port=&odds1.=iVieWinNOtePad同之前一样,填入“POST”,填入UR1.o然后,复制

33、type=2&Company1.D.”这部分字符串,作为Send的参数。代码成型:1. SubMain()2. DimStrTextAsString3. WithCreate0bject(,MSXM1.2.XM1.HP),Create0bject(,WinHttp.WinHttpRequest.5.1)4. .OpenPOST,http5. .SetRequestHeaderContent-Type,app1.ication/x-www-form-ur1.encoded6. .SetRequestHeaderRefererz,7. .Sendtype=2&Company1.D=1.1.%7C%

34、E6%BE%B3%E9%97%A8&1.eague1.D=36&team1.D=0&kind=1.&port=&odds1.=doO=%E7%A1.%AE%E5%AE%9A8. StrText=.responsetext9. Debug-PrintStrText10. EndWith11. EndSub运行。然后发现,没有成功!立即窗口没有数据:以甲 VaIUe= 309 约超联/optionoptionoption 智利春 val ue= 117 智利秋 INPUTINPUT和水INPUTINPUTtype=radioCHECKED va1.ue=0 name=kind初盘type=radi

35、o value= 1 name=kind收盘  ,  主水name=odds2c1.ass=inp id=odds2 size=5fenbsp;客水 name=odds3 class=inp id=odds3 size=56nbsp; INPUT name=zzdC立即窗口里:没有任何有用的数据就结束tab1.e了。这个字符串表示结束了某个table)。scriptIangUage=javascript”)Response框里是有数据的:TransformerHeadersTextVIewSyntaxViewImageViewHexViewWebVtewAuthCa

36、chngCoohesJSONoptionVaIUe=415智利春optionVa1.Ue=117智利秋/optionftnbsp;球队选择初盘INPUTname=odds1.* C收盘 大球optionva1.ue=*Se1.eCted盘口选择/option)IReSPOnSe框里是有数据的00/0.50.50.51.1*】-一匚1/1匚/AS*为什么没有成功呢?因为没有模拟SetRequestHeader!经验:POST时,一般都需要模拟SetReqUeStHeader的“Content-Type”字段(Header)。再回头,拷贝出Request中的Content-Type后面的

37、值:app1.ication/X-WWW-form-ur1.encoded,填入代码中。HeadersTextWewSyntaxVfewWebFormsHexViewAuthCookiesIRaWJSONXM1.PoSThtt?:/cq.存o8:COmgqdsSegrCh/HTTP/1.I-Accept:image/gif,imaejpeg,image/pipeg,image/pjpeg,app1.ication/xam1.+xm1.,app1.ication/:Referer:http:/Accept-1.anguage:zh-cn-USer二Agent:,yi1.1.a/K)(CCmPat

38、ib1.。;MSTF8.0;indcwqNT5.1;Trident/4.0;.NET4.OC;.NET4qontept,TypcIIapp1.ication/x-v/ww-form-ur1.encodedIAccept-1.ncoding:gzip,def1.ate-Host:Conten“1.ength:104Connection:Keep-A1.ivePragma:no-cachecookie:Aspsessionidcsbqqadc=Jnpfmkoceh1.mkeiojdfm1.dbitype=2&CompanyID=1.1.%7C%E6%BE%B3%E9%97%A8&1.eagueID

39、=36&teamID=0&kind=1.&port=&odds1.=&do0=%E7%AVieWinNoteDad第二次成型代码:1. SubMain()2. DimStrTextAsString3. WithCreate0bject(,MSXM1.2.XM1.HTTP),CreateObject(,WinHttp.WinHttpRequest.5.1)4. .OpenPOST,http5. .SetRequestHeaderContent-Type,app1.ication-www-form-ur1.encoded6. .SetRequestHeaderReferernz,7. .Sendtype=2&Company1.D=1.1.%7C%E6%BE%B3%E9%97%A8&1.eague1.D=36&team1.D=0&kind=1.&port=&odds1.=&doO=%E7%A1.%AE%E5%AE%9A8. StrText=.responsetext9. Debug.PrintStrText10. EndWith

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号