楼主: Data-零一
543 0

[CDA数据分析师学习之路] 从0开始学电商数据分析-16 [推广有奖]

  • 0关注
  • 18粉丝

讲师版主

本科生

44%

还不是VIP/贵宾

-

威望
0
论坛币
1040 个
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
572 点
帖子
44
精华
0
在线时间
62 小时
注册时间
2014-4-8
最后登录
2017-8-18

Data-零一 发表于 2017-8-10 11:59:43 |显示全部楼层
本帖最后由 Data-零一 于 2017-8-10 14:01 编辑

继续上一篇的内容,上一篇是讲了利用浏览器找到json数据的URL,并把源码获取下来,那么今天要做的事情就是解析这些源码。


解析源码的方法有多种。而且不同的语言自带有不同的包或者类(功能),像Python就有很丰富的包来做这块的工作,简单的一两行代码就可以完成复杂的工作。


今天我们是以VB为例,调试环境可以是VB任意版本、(Execl)VBA、VS。


Excel需要打开【开发工具】,可以在我的资料分享网盘里面找一个【代码教程录像】的视频,在视频的前5分钟内有演示。


第一步是观察获取下来的源码(注意:最终获取下来的源码不一定和在浏览器观察的一模一样),还记得上一篇的爬取代码如下

1.png


这是调用了Msxml2.XMLHTTP这个对象,也可以称之为API(接口),是专门给客户端(PC电脑)提供同http服务器通讯的协议。但不是什么服务器都认可这个协议,比如tmll.com(天猫)的服务器就把这个协议拉黑了。


标准格式是:

2.jpg


其中的【url】是这个模块的唯一变量,也就是说你想谁通讯就改成谁的地址,比如和百度通讯就把【url】改成【www.baidu.com】。


不过,像生e经、生意参谋等这类站内工具,都需要登录淘宝后才能响应请求并返回数据,在跑这个代码前还需要做一个登录江湖策的模块,类似下图,点击一下Button1,然后调用的浏览器就打开江湖策,然后登录后,再运行上面的代码才会有结果。

3.png


既然要观察,那么,就要把数据先保存下来

4.jpg


运行后,我们会在D盘里面找到一个【test.txt】的文件,打开文件,所见如下:

5.png


这是一种极其不友好的展现方式。可以用json格式化工具:http://tool.chinaz.com/Tools/JsFormat.aspx

6.png


将源码贴入文本框后,点击格式化,就会自动将这一大串json格式的源码给排列好,这样便于我们观察源码的结构。

我介绍两种方法,一种是字符定位的方法,一种是用类的方法。


首先是第一种方法。


有用过Excel函数的朋友都应该或多或少用过MID函数,比如【广东省深圳市宝安区】这一个字符串,想把“深圳”取出来,就Excel里面输入【=mid("广东省深圳市宝安区",4,2)】,表示从文本串里面第4个字符开始,取出2个长度的字符,可以在Excel里面试一下。


7.png


这是在我们知道“深圳”这个的位置的时候,才可以直接定位到,但如果不知道“深圳”在哪里的时候,甚至不知道“深圳”的长度的时候,比如碰到“石家庄”,这个时候就要想办法让程序自己判断目标数据的其实位置和长度。


这个时候就需要用到【instr】函数了,这个函数不是Excel的公共函数,只能在VBA环境里面使用,作用和【find】函数一样。我们先取出cnt字段的数据,这个数据记录的是json里面的数据量


8.jpg


【10】这个数据是在冒号和逗号之间,因此先读出前后的字符位置便可。

9.jpg


应该有很多人不理解为什么后面要加5。因为instr函数找出来的是【c】的位置。【c】到【1】的距离是5个字符

10.jpg



取出【c】的位置后

+1 可以定位到【n】

+2 可以定位到【t】

+3 可以定位到【"】

+4 可以定位到【:】

+5 可以定位到【1】

mid前面的两个减号(--)是将取出来的字符转换成数字。


运行结果cnt=10,表示我现在爬下来的数据里面有10条访客数据


基于这个原理,我们就可以把里面的数据提取出来。我以locationName(访客地址为例)


11.jpg


代码如下:

12.jpg


运行结果:

13.jpg


特殊说明一下,对for循环的作用不清楚的可以问度娘。chr(34)代表双引号,cells(i,1)代表Excel工作表的第i行,第1列。

如果要提取更多的数据直接在for循环里面添加代码即可。

第二种方法相对比第一种要简单得多。


直接用JSON解析的类来读取数据



这个源码的格式就是JSON文件,结构是这样的:

{"参数字段":"参数",……,"res":[{数据模块1},{数据模块2},……,{数据模块10}]}

一个模块就是一个UV的信息。

我们的目标数据就是数据模块1-10里面的【locationName】字段

首先第一步是导入类文件,可以在我的资料分享盘里面找到【16篇模块】这个文件夹,类模块的文件后缀是【cls】,也可以直接找到【xlsm】文件,这个文件已经导入好类模块,可以直接用office2013或者2016版本调试。


第二步是根据JSON文件的格式,确认数据。


下图,红色框的是第1级,绿色框的是第2级,紫色框的是第3级

14.png


比如,现在要取出cnt的数据,那么格式就是:

JSON("cnt")

而我们的目标数据locationName是在紫色框下的,是第3级,那么格式就是:

JSON("res")(1)("locationName")


用这个方法,代码写起来很清爽。

15.jpg


dicJSON("res")(i)("locationName")这个写法就是根据文件的格式,直接定位到

{……,"res":[{第i个数据模块里面的locationName字段}]}

每个不同的JSON文件,数据字段的定义都不一样的,在这个文件里面,数据都在【res】字段下面,如果字段名字变了,只要观察一下数据再哪个[](中括号)里面,把第1级字段找出来。

调试文件,登陆自己的江湖策账号,然后分别点击两个按键,观察两种方法的


结果。


16.jpg



【登陆江湖策】按键的代码

17.jpg



【第一种方法】按键的代码

18.jpg



【第二种方法】按键的代码

19.jpg



编程基础的问题,可以度娘一下。度娘是万能的!









支持楼主:购买VIP购买贵宾 购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
 
载入中......
4.jpg
3.png
您需要登录后才可以回帖 登录 | 我要注册

GMT+8, 2017-8-24 13:01