ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA抓取网页内的数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-20 21:30 | 显示全部楼层 |阅读模式
各位大神,我想通过VBA抓取这个网站的数据,https://www.jisilu.cn/data/stock/dividend_rate/#cn  由于刚刚学习VBA,在home里学习很多前辈的抓取代码进行改造,但是无法成功,麻烦哪位大神帮忙修正一下,谢谢!
    Sub test()
    Dim HTML, URL
    Set HTML = CreateObject("htmlfile")
    URL = "https://www.jisilu.cn/data/stock/dividend_rate/#cn"
    With CreateObject("msxml2.xmlhttp")
        .Open "get", URL, False
        .send
        HTML.body.innerhtml = .responsetext
        Set tb = HTML.all.tags("table")(7).Rows
        For i = 0 To tb.Length - 9
            For j = 0 To tb(i).Cells.Length - 1
                Cells(i + 1, j + 1) = tb(i).Cells(j).innertext
            Next
        Next
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2018-1-20 22:29 | 显示全部楼层
试试:
  1. Sub GXPX()
  2. Dim ie, dmt, r, i, j, k
  3. Set ie = CreateObject("internetexplorer.application")
  4. On Error Resume Next
  5. Application.DisplayAlerts = False
  6. Cells.Clear
  7. With ie
  8.      .Navigate "https://www.jisilu.cn/data/stock/dividend_rate/#cn"
  9.      While ie.ReadyState <> 4 Or ie.Busy
  10.            DoEvents
  11.      Wend
  12.      Set dmt = .Document
  13.      Set r = dmt.All.tags("table")(0).Rows
  14.      For k = 0 To r.Length - 1
  15.          For j = 0 To r(k).Cells.Length - 1
  16.              Cells(k + 1, j + 1) = r(k).Cells(j).innerText
  17.          Next j
  18.      Next k
  19. End With
  20. Columns("B:Z").Columns.AutoFit
  21. Set ie = Nothing
  22. Set dmt = Nothing
  23. Set r = Nothing
  24. Application.DisplayAlerts = True
  25. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-1-20 22:31 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-20 22:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-7-7 20:43 | 显示全部楼层

虽然我不是用于楼主的目的,但根据您的代码,解决了我的问题,先表示十分感谢!
在实际使用当中发现,我照您的代码思路,有的时候正常,有的时候不正常,在有的机器上正常,在有些机器上完全不运行,百思不得其解,逐步排查,发现IE在创建的时候会启动一个进程,在调用navigate的时候又会启动一个进程,会造成获得的句柄不是新开启的那个进程,这时候自然不会正常获得数据,后来想了个笨办法,用shell里的一个属性,获得所有窗口的URL,找出来正确的那个进程句柄,后来再没有出现问题,现贴出来分享一下,希望能找到一个更简洁的办法来解决这个问题。


  1. Sub GXPX()
  2. Dim IE, dmt, r, i, j, k
  3. Set IE = CreateObject("internetexplorer.application")
  4. Set sh = CreateObject("shell.application")
  5. On Error Resume Next
  6. Application.DisplayAlerts = False
  7. Cells.Clear
  8. With IE
  9.      .Navigate "https://www.jisilu.cn/data/stock/dividend_rate/#cn"
  10.      
  11.      While IE.ReadyState <> 4 Or IE.Busy
  12.            DoEvents
  13.      Wend
  14.      Do
  15.         For Each eachIE In sh.Windows
  16.             If InStr(1, eachIE.locationURL, "https://www.jisilu.cn/data/stock/dividend_rate/#cn") Then
  17.                 Set IE = eachIE
  18.                 Exit Do
  19.             End If
  20.         Next eachIE
  21.      Loop
  22.      Set dmt = .Document
  23.      Set r = dmt.All.tags("table")(0).Rows
  24.      For k = 0 To r.Length - 1
  25.          For j = 0 To r(k).Cells.Length - 1
  26.              Cells(k + 1, j + 1) = r(k).Cells(j).innerText
  27.          Next j
  28.      Next k
  29. End With
  30. Columns("B:Z").Columns.AutoFit
  31. IE.Quit
  32. Set IE = Nothing
  33. Set dmt = Nothing
  34. Set r = Nothing
  35. Set sh = Nothing
  36. Application.DisplayAlerts = True
  37. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-8-8 10:33 | 显示全部楼层
vix01 发表于 2019-7-7 20:43
虽然我不是用于楼主的目的,但根据您的代码,解决了我的问题,先表示十分感谢!
在实际使用当中发现,我 ...

我直接复制代码但是提示automation 错误,8888ffff,或者显示类未注册,但是我在引用里已经勾选了Microsoft internet control

TA的精华主题

TA的得分主题

发表于 2019-8-19 16:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

这个怎么改呢?求大神赐教

TA的精华主题

TA的得分主题

发表于 2019-9-21 10:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在     While IE.ReadyState <> 4 Or IE.Busy
           DoEvents
     Wend
这个循环后面加入下面一段就OK了
  t = Timer
     Do Until Timer > t + 1         
        DoEvents
     Loop
这是加入时间等待网页完全加载好,才能读取到表格,上面那个循环并不能保证加载好。
另外注意Set r = dmt.All.tags("table")(0).Rows中表格的编号是否是0,在集思录里同一个页面可能有多个标签,第几个标签就是第几张表

TA的精华主题

TA的得分主题

发表于 2020-1-4 22:59 | 显示全部楼层
正在研究集思录的数据抓取,谢谢大神!

TA的精华主题

TA的得分主题

发表于 2021-11-20 17:52 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
kkkkzhou 发表于 2019-8-8 10:33
我直接复制代码但是提示automation 错误,8888ffff,或者显示类未注册,但是我在引用里已经勾选了Microso ...

请问对于这个问题后来有方法解决吗
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 09:27 , Processed in 0.046753 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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