ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 解析网页源码,获得所需数据。

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-11-2 11:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Kaohsing 发表于 2017-11-2 11:05
看看捏个分时图的网址,解析一下。

没有获取股票代码啊。。。再改下

TA的精华主题

TA的得分主题

发表于 2017-11-2 11:59 | 显示全部楼层
duquancai 发表于 2017-11-2 09:36
网抓   主要是在于“抓”这个字,抓下来后的 数据 的处理 还有  正则法、解析法等!还是重点在于如何抓到 ...

老大,上次那个网页的股票代码还没搞完

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 12:40 | 显示全部楼层
本帖最后由 Kaohsing 于 2017-11-2 13:52 编辑

列二
网址http://data.eastmoney.com/zjlx/detail.htmlS T1.png T2.png T3.png

file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg
Sub 全部股票实时资金流向排行()
   P = ""
   URL ="http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx/JS.aspx?type=ct&st=(BalFlowMain"& P & ")&sr=-1&p=1&ps=2&js=var%20dy={pages:(pc),data:[(x)]}&token=894050c76af8597a853f5b408b759f5d&cmd=C._AB&sty=DCFFITA&rt="& Rnd() * 100000000
   With CreateObject("MSXML2.XMLHTTP")
       .Open "GET", Replace(URL,"50&js=var%20dy={pages:(pc),data:[(x)]}","1&js=(pc),(x)"), False
       .Send
       .Open "GET", Replace(URL, "ps=1", "ps="& Split(.ResponseText, ",")(0)), False
       .Send
       tt = .ResponseText
   End With
    Debug.Print tt:   ' tt = Replace(tt, ":[""",""",""")
    tt =Split(Split(tt, ":[""")(1), """]}")(0)
   Debug.Print tt
   tt = Split(tt, """,""")   
   With Sheets("股价")
        .Cells.Clear
       .[A1] = "代码": .[B1] = "名称": .[C1] = "股价": .[D1] = "时间"
       For i = 1 To UBound(tt)
            .Cells(i + 1, 1) = Split(tt(i),",")(1)
            .Cells(i + 1, 2) = Split(tt(i),",")(2)
            .Cells(i + 1, 3) = Split(tt(i),",")(3)
            .Cells(1 + i, 4) = Split(tt(i),",")(15)
       Next
       .[a:a].NumberFormatLocal = "000000"
   End With
End Sub



评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 12:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-11-2 12:48 | 显示全部楼层
不用工具能直接分析出动态URL吗,

TA的精华主题

TA的得分主题

发表于 2017-11-2 12:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Kaohsing 发表于 2017-11-2 12:46
耐心等待,一步步的来。

依飘画狐,居然蒙对了。。呵呵。。看看这样可不可以。。Debug.Print "股票代码:" & Split(Split(zz(i), """>")(0), "<")(0) & vbTab

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 12:56 | 显示全部楼层
说说CreateObject("htmlfile")解析数据
世界是纷繁复杂,所以就了“曲径通幽”,“殊途同归”,“条条大路通罗马”等词语,如果觉得split不好用,可以用用CreateObject("htmlfile")。

首先来一点一点点html知识,来自http://www.w3school.com.cn/
<table> 标签定义 HTML 表格。简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。
tr 元素定义表格行,th 元素定义表头,td 元素定义表格单元。
更复杂的 HTML 表格也可能包括 caption、col、colgroup、thead、tfoot 以及 tbody 元素

用到的代码:
Set html =CreateObject("HTMLFile")
Set win =CreateObject("WinHttp.WinHttpRequest.5.1")   
     With win
        .Open"GET", url, False
        .send
        html.body.innerHtml= .responseText
    End With
查看源码, 发现数据都在td标签中.(与代码一样,标签也是可以嵌套的,是对内容的修饰的,当然现在大多数是通过csss实现的)
<trdata-p="41.65" data-about="100" data-r="192.69"data-ltsz="10.82" data-limit_times = "23">
<td><a href="/quote/sh603903.html"target="_blank" data-showchart-code="603903">中持股份</a></td>
<td >41.65</td>   <td >100%</td>    <td class=" stockred" >192.69%</td>  <td>10.82亿</td>   <td>23次</td>
添加一句代码Set td= oDoc.getElementsByTagName("td"),代码运行后如下图:
1.png
2.png
3.png


TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 13:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 14:53 | 显示全部楼层
本帖最后由 Kaohsing 于 2017-11-16 07:37 编辑



续说CreateObject("htmlfile")解析数据


数据出来了,不相关数据也有,那就在筛选一下.
<TD><A href="about:/quote/sh603903.html" target=_blank data-showchart-code="603903">中持股份</A></TD>
那就找找红色字出现的位置,修改后运行如下
j3.png j4.png j5.png

j7.png j8.png j9.png

遍历了一下,总的遍历和赋值到单元格与数组就不写啦。附上所用代码
Sub kaohsing1()
   Set HTML = CreateObject("HTMLFile")
   URL ="http://www.yuncaijing.com/markethot/discovery.html?keyword=%E9%9B%84%E5%AE%89"
   Set win = CreateObject("WinHttp.WinHttpRequest.5.1")
   With win
       .Open "GET", URL, False
       .send
       HTML.body.innerHTML = .responseText
   End With
   Set tr = HTML.getElementsByTagName("tr")
   For j = 0 To tr.Length - 1
       If InStr(tr(j).innerHTML,"<TD><A href=""abo") = 1 Then Exit For
   Next   
   '----------------------------------数据挨在一块
   'For i = j To tr.Length - 1
    '  tt = tt & "  |" & vbTab & i & "....." & tr(i).innertext
       'If i Mod 3 = 0 Then Debug.Print tt: tt = ""
   'Next
   '-----------------------------------
   'Debug.Print tr(3).innertext
   'Debug.Print tr(3).ChildNodes(0).innertext
   'Debug.Print tr(3).ChildNodes(1).innertext
   For i = 0 To tr(3).ChildNodes.Length - 1
     Debug.Print tr(3).ChildNodes(i).innertext
   Next
  Stop
End Sub





评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-11-2 15:05 | 显示全部楼层
Kaohsing 发表于 2017-11-2 13:54
初次发这种贴,没有经验。

发最后这个方法的源码,照抄都取不到数据。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 21:19 , Processed in 0.043406 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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