ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-11-8 09:18 | 显示全部楼层
深度好贴,学习了

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-12 17:31 | 显示全部楼层
本帖最后由 Kaohsing 于 2017-11-14 16:20 编辑

  多种方法提炼一网站数据目标:
s1.png

单个数据网址:http://data.eastmoney.com/notice ... me=&rt=50344825
一般该网数据大体这样: 返回的数据存在于一个js 变量中。(var就是显示声明变量的)
var GeyLybKP = {
    "data": [{
        "NOTICEDATE": "2017-11-13T00:00:00+08:00", ’utc时间格式
        "ATTACHTYPE": "0",
        "ATTACHSIZE": 108,
        "ENDDATE": "2017-11-13T00:00:00+08:00",
        "NOTICETITLE": "600267:海正药业关于收到浙江省国资委关于公司非公开发行股票有关事项的批复的公告",
        "INFOCODE": "AN201711121033682366",            '这里好像是这只股票的身份证
        "CDSY_SECUCODES": [{"SECURITYVARIETYCODE": "1000001872","SECURITYTYPECODE": "058001001",
          "SECURITYCODE": "600267","SECURITYFULLNAME": "海正药业","SECURITYSHORTNAME": "海正药业",
         "SECURITYTYPE": "A股", "TRADEMARKETCODE": "069001001001", "TRADEMARKET": "上交所主板",
                     "LISTINGSTATE": "0", "COMPANYCODE": "10000218", "Eid": 0        }],
        "ANN_RELCOLUMNS": [{ "COLUMNCODE": "001002001002001004", "COLUMNNAME": "增发获准公告",
                       "NodeName": null,   "Eid": 0,  "Order": 113  }],
        "ANN_RELCODES": [{  "CODETYPE": "058001001", "CODEMARKET": "069001001001", "SECURITYCODE": "600267",
                      "COMPANYCODE": null, "Eid": 0  }],
        "EUTIME": "2017-11-12T16:45:40+08:00",
        "TABLEID": 207000003473122421,
        "Order": 113,
        "Url": http://data.eastmoney.com/notice ... N201711121033682366,JWU2JWI1JWI3JWU2JWFkJWEzJWU4JThkJWFmJWU0JWI4JTlh.html"
    }], 以下为辅助信息
    "TotalCount": 1000,      "pages": 1000,    "rc": 1,    "me": null,
    "dataUrl": "http://newsnotice.eastmoney.com/webapi/api/Notice?Time=&CodeType=1&StockCode=&FirstNodeType=0&SecNodeType=0&PageIndex=1&PageSize=1&Token=WZSJPD161130"
};

大体就这样,先来段理论垫垫。

Split函数

描述   返回一个下标从零开始的一维数组,它包含指定数目的子字符串

语法   Split(expression[, delimiter[, limit[, compare]]])


  • expression, 必需的参数。该字符串表达式,可以包含分隔符的字符串。
  • delimiter, 一个可选的参数。参数用于转换成基于定界符数组。
  • count, 一个可选的参数。要返回子串的数目,并且如果指定为-1,那么所有的子串被返回。
  • compare, 一个可选的参数。此参数指定要使用哪个比较方法。





TA的精华主题

TA的得分主题

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

文接上楼
       时间就是键"NOTICEDATE"的值(js语境),好像字典的key与value。value可以重复,key 必须唯一。所以时间就有了不同的键。
      由于各个股票有多种属性(代码,股钟,上市时间啦==),所以不能交叉着取数据,所以需要split分割开,通过观察,发现他是
通过"},{"那就写个代码试试吧
j1.png
确实验证啦。同时证明了split返回的是数组。有个不足,股票(0)含有多余的数据,那就先整体处理一下,
j2.png
数据就比较板正了,便于批量提取。下面就演示遍历一只股票的数据。数据是 ","间隔,那就试试
j3.png
     数据不是太理想,键值是有规定的,值若是字符串,则用引号包裹一下,数字不用,我们只是取数据,他妨碍我们取数据,我们就用
replace替换一下。
j4.png
数据,还在算可以,数据清爽,还有1,2个捣乱的,但不影响取数。那就在处理一下。
j5.png
这下可以啦。遍历一下,就可以去到数据啦(不过还需要用split),具体的实现过程就不写了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-13 15:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
   文接53楼
一般以接近数据的地方使用split。
s1.png
虽然快要接近数据,但是每只股票的数据,不容易取
. s4.png s2.png
这样就可以啦。
这是每只股票的数据是这样的:
2017-11-14T00:00:00+08:00","ATTACHTYPE":"0","ATTACHSIZE":148,"ENDDATE":"2017-11-14T00:00:00+08:00","NOTICETITLE":"600446:金证股份2017年公开发行公司债券(面向合格投资者)(第一期)票面利率公告","INFOCODE":"AN201711131034598817","CDSY_SECUCODES":[{"SECURITYVARIETYCODE":"1000001753","SECURITYTYPECODE":"058001001","SECURITYCODE":"600446","SECURITYFULLNAME":"金证股份","SECURITYSHORTNAME":"金证股份","SECURITYTYPE":"A股","TRADEMARKETCODE":"069001001001","TRADEMARKET":"上交所主板","LISTINGSTATE":"0","COMPANYCODE":"10001321","Eid":0},{"SECURITYVARIETYCODE":"1001023435","SECURITYTYPECODE":"060","SECURITYCODE":"143367","SECURITYFULLNAME":"深圳市金证科技股份有限公司2017年公开发行公司债券(面向合格投资者)(第一期)","SECURITYSHORTNAME":"17金证01","SECURITYTYPE":"债券","TRADEMARKETCODE":"069001001","TRADEMARKET":"上海证券交易所","LISTINGSTATE":"9","COMPANYCODE":"10001321","Eid":0}],"ANN_RELCOLUMNS":[{"COLUMNCODE":"001002008","COLUMNNAME":"其他","NodeName":null,"Eid":0,"Order":999},{"COLUMNCODE":"003006005","COLUMNNAME":"票面利率
公告","NodeName":null,"Eid":0,"Order":999}],"ANN_RELCODES":[{"CODETYPE":"058001001","CODEMARKET":"069001001001","SECURITYCODE":"600446","COMPANYCODE":null,"Eid":0},{"CODETYPE":"060","CODEMARKET":"069001001","SECURITYCODE":"143367","COMPANYCODE":null,"Eid":0},{"CODETYPE":"058001001","CODEMARKET":"069001001001","SECURITYCODE":"600446","COMPANYCODE":null,"Eid":0},{"CODETYPE":"060","CODEMARKET":"069001001","SECURITYCODE":"143367","COMPANYCODE":null,"Eid":0}],"EUTIME":"2017-11-13T15:37:20+08:00","TABLEID":207000003488873539,"Order":999,"Url":"http://data.eastmoney.com/notices/detail/600446/AN201711131034598817,JWU5JTg3JTkxJWU4JWFmJTgxJWU4JTgyJWExJWU0JWJiJWJk.html"},{"

s5.png
怪不得这磨难弄,里面有嵌套,看来用split需要多走几步,方可取得数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-13 20:04 | 显示全部楼层
   文接54楼
    对于简单的js数组,或者json,split处理是比较简单的,对与复杂的嵌套,就比较繁琐了。
   该轮着正则出场了.
  还是分析一下源码.
:[{"NOTICEDATE":"2017-11-14T00:00:00+08:00","ATTACHTYPE":"0","ATTACHSIZE":316,"ENDDATE":"2017-11-14T00:00:00+08:00","NOTICETITLE":"601777:力帆股份关于全资子公司与北京百度网讯科技有限公司及重庆盼达汽车租赁有限公司签署《战略合作框架协议》暨关联交易的公告","INFOCODE":"AN201711131034804781","CDSY_SECUCODES":[{"SECURITYVARIETYCODE":"1000007849","SECURITYTYPECODE":"058001001","SECURITYCODE":"601777","SECURITYFULLNAME":"力帆股份","SECURITYSHORTNAME":"力帆股份","SECURITYTYPE":"A股","TRADEMARKETCODE":"069001001001","TRADEMARKET":"上交所主板","LISTINGSTATE":"0","COMPANYCODE":"80115598","Eid":0}],"ANN_RELCOLUMNS":[{"COLUMNCODE":"001002008","COLUMNNAME":"其他","NodeName"
红字部分就是所需数据,所以精简一下
:[{"NOTICEDATE":"2017-11-14T00:00:00+08:00",.*?,"NOTICETITLE":"601777:力帆股份关于全资子公司与北京百度网讯科技有限公司及重庆盼达汽车租赁有限公司签署《战略合作框架协议》暨关联交易的公告",.*?""SECURITYCODE":"601777","SECURITYFULLNAME":"力帆股份".*?COLUMNNAME":"其他","NodeName"
.*? 在正则中可以代替任意的字符。所以写成正则就是
"NOTICEDATE"":""(.*?)T.*?,""NOTICETITLE"":""(.*?)"",.*?""SECURITYCODE"":""(.*?)"",""SECURITYFULLNAME"":""(.*?)"".*?COLUMNNAME"":""(.*?)"",""NodeName"
运行验证一下:
s2.png
效果可以,只要遍历一下,就可以,至于排列顺序,调整一下。至于没有出现的那个“更多公告 数据 股吧 研报
”,自己构造一下,正则用起来比较简单,比js函数还要简单。js函数就不做解析啦。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

  文接上楼
  公告大全部分代码(为了避免或许麻烦,只贴截图) s11.png

公告大全a.rar (115.5 KB, 下载次数: 132)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-11-14 17:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Kaohsing 发表于 2017-11-14 10:47
文接上楼
  公告大全(新三板公告不提供)

老师太强大了,全部抓取了,真太烦劳老师了,

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-14 17:13 | 显示全部楼层
五指山888 发表于 2017-11-14 17:04
老师太强大了,全部抓取了,真太烦劳老师了,

新三板公告暂时不抓取。每个公告大约有1000页,所以运行较慢。异步抓取暂不提供。

TA的精华主题

TA的得分主题

发表于 2017-11-14 17:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
五指山888 发表于 2017-11-14 17:04
老师太强大了,全部抓取了,真太烦劳老师了,

在我前面已经有4位亲下载了,如果有鲜花就给老师送一多吧。

TA的精华主题

TA的得分主题

发表于 2017-11-14 17:31 | 显示全部楼层
Kaohsing 发表于 2017-11-14 17:13
新三板公告暂时不抓取。每个公告大约有1000页,所以运行较慢。异步抓取暂不提供。

已经很好用了,谢谢老师,不要再麻烦了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 20:57 , Processed in 0.049167 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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