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-10-26 12:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 a4569874 于 2014-10-26 12:36 编辑
wcymiss 发表于 2014-10-26 09:42
处理xml数据
8楼的例子返回的就是一个xml文档。

麻烦说下这个如何实现VBA批量下载并保存网页,网页的地址以提取到在excel B列中
每次下载都带上伪造的RequestHeader和cookie才能下载

Sub Main()
     Dim strText As String
    With CreateObject("WinHttp.WinHttpRequest.5.1") '
        .Open "GET", "文件地址(B栏)", False
         .setRequestHeader "Accept-Encoding", "identity"
         .setRequestHeader "Cookie","C"
         .setRequestHeader "User-Agent", "Apache-HttpClient/UNAVAILABLE (java 1.4)"
         .Send

         strText = .responsetext
         Debug.Print strText
     End With
End Sub


excel的排布如下表
例子(例子中的下载地址是不需要伪造cookie和RequestHeader)

序号文件地址伪造的cookie栏保存时文件名
1
http://mmsns.qpic.cn/mmsns/DczbRN9ysbnlk6tnJ6RwN2PWIhCXI9lEJRSsR8WG43bJueeX3MJugQ/0伪造的cookie12013-10-11.jpg
2
http://mmsns.qpic.cn/mmsns/DczbRN9ysbnVGORdoy6f0VcjeKYd6W4gqBUiaqftykzicj6ObjWHIl7w/0伪造的cookie22013-10-10.jpg
3
http://mmsns.qpic.cn/mmsns/DczbRN9ysblVV4KbccnLcsmOy4x2HGicLibLIQLeskwdic8ibM1w14e6Iw/0伪造的cookie32013-10-09.jpg
4
http://mmsns.qpic.cn/mmsns/DczbRN9ysbmWfqIIwQUCT1F6A6xLHGuJFbyqjLQowFaxfFY8ANnVaw/0伪造的cookie42013-10-08.jpg
5
http://mmsns.qpic.cn/mmsns/DczbRN9ysblWBUxuehg9A7Q6ibqXvEw3Evf7pRjMQwNoBvwhmcacqIQ/0伪造的cookie52013-10-07.jpg
6
http://mmsns.qpic.cn/mmsns/DczbRN9ysbkAcsXt7Fv9dDyFIpIQBpiasuQ10D8vESLibIvUbrnhIa8w/0伪造的cookie62013-10-06.jpg
同时设置每个文件的下载间隔为1秒

先谢谢了

点评

你可以另外开贴提问。这里我打算写完贴再看问题。  发表于 2014-10-27 09:31

TA的精华主题

TA的得分主题

发表于 2014-10-26 13:07 | 显示全部楼层
ghostjiao 发表于 2014-10-25 21:49
嘿嘿,做了一下抓取全部数据,速度简直慢得令人发狂,懒得优化了,先这样吧

学习了,多谢分享!

TA的精华主题

TA的得分主题

发表于 2014-10-26 14:59 | 显示全部楼层
下面应该是Json了吧,之前做的一个网页,用html和split能处理,心血来潮想学习下Json,但是这个网页的Json好像是复杂一些,只能取出第1行,其他行就不行了,有没有高人给指导一下,网址是http://www.okooo.com/soccer/match/680903/odds/
取代码是
  1. Sub test3()

  2.     'Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
  3.     Set winhttp = CreateObject("Microsoft.XMLHTTP")
  4.     With winhttp
  5.         .Open "GET", "http://www.okooo.com/soccer/match/680903/odds/ajax/?page=0&companytype=BaijiaBooks&type=1", False
  6.         .send
  7.         t1 = .responsetext
  8.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  9.             .SetText t1
  10.             .PutInClipboard
  11.         End With
  12.     End With

  13. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-26 15:52 | 显示全部楼层
suwenkai 发表于 2014-10-25 22:26
����
吴老师说了,这是给初学者做的题。我就不修改了,你看一下网页的数据结 ...

suwenkai 老师您好,基本看懂了,但对于初学者来说要想越过重复的部分确实有难度啊,我看网上其他童鞋的作业都出现数据重复,怎么避免重复呢,这可不是初学者能做到的,还是请您出手

TA的精华主题

TA的得分主题

发表于 2014-10-26 16:08 | 显示全部楼层
本帖最后由 xmyjk 于 2014-10-26 16:09 编辑
wcymiss 发表于 2014-10-22 12:30
新手作业:

网站:http://weibo.com/guide/welcome


玩一玩。
  1. Sub tt()
  2. Dim winhttp, getpage As String, sue As String, sup As String, tmp, i&

  3. sue = "es%3D1cabe4b5d992a5c94dfedf5dc3ade241%26ev%3Dv1%26es2%3Ddcb3da567bd8046564bbe02a5fa52dab%26rs0%3Dsjy1MikDLqmlcIC1RtS7%252BXIVrPYE%252B9eMeVUk44z0oXOZ7RzEIHi%252B9rx%252B8IikznyAfTB9ikrym%252BiEUcyvBKZ4vJ7%252FR%252BTaBFLSOj%252BqlMc3gURumg%252FyZyaJT0s%252FwBJS5dM9IlXgcBjJxt6CXQ%252FRVPOtMrUXl8JUeazx7Sm1NweBPPY%253D%26rv%3D0"
  4. sup = "cv%3D1%26bt%3D1414308998%26et%3D1414395398%26d%3Dc909%26i%3Dc614%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D2%26st%3D0%26uid%3D2231960134%26name%3Dyajjkk%2540sina.com%26nick%3Dyajjkk%26fmp%3D%26lcp%3D2011-07-07%252021%253A54%253A41"
  5. Set winhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
  6. With winhttp
  7.     .Open "GET", "http://weibo.com/friends?leftnav=1&wvr=5&isfriends=1&step=2", False
  8.     .setRequestHeader "Cookie", "SUE=" & sue & "; SUP=" & sup & ";"
  9.     .send
  10.     tmp = Filter(Split(.responsetext, "<"), "feed_list_content"">")
  11. End With
  12. For i = 0 To UBound(tmp)
  13.     tmp(i) = Split(tmp(i), ">")(1)
  14. Next
  15. ActiveSheet.UsedRange.Clear
  16. [a1].Resize(UBound(tmp) + 1, 1) = Application.Transpose(tmp)
  17. End Sub
复制代码
呵呵,我登陆没选下次自动登陆,过一天左右sue和sup就失效了,就没法用了。
所以呵呵,如果要长期使用,还是要理会cookie的生存周期,即使你不考虑,服务器也会考虑了,可以把下次自动登陆选上,取到的sue和sup可以用很久。
题外话:
另外,微博点击退出登录时,服务器没有删除cookie即使清理,才有这个漏洞,如果用这个方法去试看QQ邮箱,呵呵。只要点击了退出登陆,QQ邮箱服务器会删除cookie,就没法用这个方法了。即使没有点击退出邮箱,QQ邮箱服务器在无法检测到心跳连接时,也会清掉cookie,所以,这个只是部分网站和论坛的问题,开发者没有去做安全测试。就包括discuz论坛很多都有这个问题。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-26 17:02 | 显示全部楼层
介绍得很全面,抓取速度非常快,学习网抓新知识。

TA的精华主题

TA的得分主题

发表于 2014-10-26 17:07 | 显示全部楼层
这个教学帖子,一下子被顶火了,从一个侧面反映学习网抓实用技术的人很多,后续学习部队很庞大。

TA的精华主题

TA的得分主题

发表于 2014-10-26 17:57 | 显示全部楼层
引子玄 发表于 2014-10-26 17:07
这个教学帖子,一下子被顶火了,从一个侧面反映学习网抓实用技术的人很多,后续学习部队很庞大。

就是就是,大师,你感觉网抓比Excel里用VBA处理数据要难很多还是不会难很多啊?论坛里有很多网抓的帖子,但感觉网抓很难都不敢去学,直接学这论坛里的网抓教程贴能行吗?或者说还要学点你们说的那什么javascript之类的东西啊?

TA的精华主题

TA的得分主题

发表于 2014-10-26 17:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 excel002009 于 2014-10-26 18:05 编辑
引子玄 发表于 2014-10-26 17:07
这个教学帖子,一下子被顶火了,从一个侧面反映学习网抓实用技术的人很多,后续学习部队很庞大。

就是就是,大师,你感觉网抓比Excel里用VBA处理数据要难很多 还是不会难很多啊?论坛里有很多网抓的帖子,但感觉网抓很难都不敢去学,直接学这论坛里的网抓教程贴能行吗?我就是怕没有基础教学贴,我连基本语句都会写错。  或者说还要学点你们说的那什么javascript之类的东西啊?
学网抓大概多久能学会啊?

TA的精华主题

TA的得分主题

发表于 2014-10-26 19:44 | 显示全部楼层
战战如疯 发表于 2014-10-26 14:59
下面应该是Json了吧,之前做的一个网页,用html和split能处理,心血来潮想学习下Json,但是这个网页的Json好 ...

之前取网页是如何取全部页共280条记录的?求分享。


173楼问题。我的作业是
  1. Private Sub GetData()

  2.     Dim tt As String, winhttp, t1, arr, i, v
  3.     Set winhttp = CreateObject("Microsoft.XMLHTTP")
  4.     With winhttp
  5.         .Open "GET", "http://www.okooo.com/soccer/match/680903/odds/ajax/?page=0&all=1&companytype=BaijiaBooks&type=1 ", False
  6.         .send
  7.         t1 = .responsetext
  8.         Debug.Print t1
  9.         i = 1
  10.         arr = Split(Split(Split(t1, "data_str = '")(1), "';var pageData")(0), "';")
  11.         strJSON = arr(0)
  12.         Set objSC = CreateObject("ScriptControl")
  13.         objSC.Language = "JScript"
  14.         strFunc = "function getjson(s) { return eval('(' + s + ')'); }"
  15.         objSC.AddCode strFunc
  16.         Set objJSON = objSC.CodeObject.getjson(strJSON)
  17.         For Each v In objJSON
  18.             n = n + 1
  19.             Cells(n, 1) = v.CompanyName
  20.             Cells(n, 2) = v.End.home: Cells(n, 3) = v.End.draw: Cells(n, 4) = v.End.away
  21.             Cells(n, 5) = v.Radio.home: Cells(n, 6) = v.Radio.draw: Cells(n, 7) = v.Radio.away
  22.             Cells(n, 8) = v.Kelly.home: Cells(n, 9) = v.Kelly.draw: Cells(n, 10) = v.Kelly.away
  23.         Next
  24.     End With
  25. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 07:24 , Processed in 0.051910 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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