Stata 网络数据爬取:JSON篇

Stata 网络数据爬取:JSON篇

其实之前在中国的工业企业都在哪里?—— Stata、高德接口与地理编码课程中就已经介绍过 Stata 处理 json 格式的数据的方法了,因为高德地图接口返回的数据就是 json 格式的。今天我将通过最近我搜集的一些案例来演示如何进行网页分析以及使用 Stata 处理 JSON 数据。

视频讲解

案例一:新冠肺炎疫情事件脉络

这个网站在这里:http://xgml.zhiweidata.net/

我们要爬取这个图的数据。

通过网页分析我们可以看着这个网页中的图的数据来源于两个 json 格式的数据:

  1. http://xgml.zhiweidata.net/data.json
  2. http://xgml.zhiweidata.net/line.json

使用 R 语言可以很方便的将 JSON 格式的文件读取为 list 处理(对 R 不了解的小伙伴可以跳过):

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

上面的代码就是将这两个数据处理成了 xlsx 文件。

那么我们的 Stata 用户如何处理这个数据呢?使用 insheetjson 即可,这个命令很强大的!

首先是安装:

1
2
3
4
5
6
7
8
9
* 安装 tssc(下面的两句成功运行一句即可安装)
* 从 Gitee 上安装
net install tssc.pkg, from("https://tidyfriday.gitee.io/tssc/")
* 从 GitHub 上安装:
net install tssc.pkg, from("https://czxa.github.io/tssc/")

* 使用 tssc 安装 insheetjson 和 libjson:
tssc install insheetjson
tssc install libjson

如果你无法使用 tssc 安装 insheetjson 和 libjson 也没关系,我已经在附件里准备好了这两个命令的离线安装包,可以使用 net install 安装:

1
2
net install insheetjson.pkg, from("insheetjson文件夹的路径")
net install libjson.pkg, from("libjson文件夹的路径")

使用 Stata 开头两句:

1
2
clear all
cd "工作目录的路径"

我们首先把 data.json 和 line.json 下载下来:

1
2
copy "http://xgml.zhiweidata.net/data.json" "data.json", replace
copy "http://xgml.zhiweidata.net/line.json" ., replace

首先处理 data.json:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

可以看到,一共有 346 个观测值,我们先把第一个观测值读入 Stata:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

然后再循环把剩下的 345 个逐个读入,使用 offset 选项即可设置读入存放到第几个观测值:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

下面再处理下:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

同样的方法处理 line:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

案例二:获取 VINSIGHT 网站上的系统性风险数据

这个网站在这里:http://vinsight.shanghai.nyu.edu/srisk.php

我们要爬取这个图里面的数据。

通过网页分析可以发现这个图的数据在这里:http://vinsight.shanghai.nyu.edu/core/get_srisk.php?assetid=china&number=10000

这个数据更好处理了,这是个 JSON 数组!

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

JSON 数据不需要循环处理,可以直接读入。

这个网页下面还有一个图:

这个图的数据不用网页分析查看在哪里,因为它在源代码里面,我们把数据部分复制保存下:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这个的处理和案例一是一样的。

案例三:沪深 300 VIX 与 上证 50 VIX

这个网页在这里:http://vinsight.shanghai.nyu.edu/implied_moments.php

从两个图里面可以爬取到沪深 300 波动率指数和 上证 50 波动率指数,同样它们的数据在源代码里,这个的处理和上面的案例二中的 系统性风险排名 的爬取类似,所以我把这个作为作业留给大家。

案例四:爬取和讯网的AB股上市公司信息列表

这个数据在这里:

1
http://stockdata.stock.hexun.com/gszl/data/jsondata/jbgk.ashx?count=5000&titType=null&page=1&callback=hxbase_json15

大概没有比这个更加丧心病狂的了!这其实不是一个 JSON 数据,而是个 JS 对象(带回掉函数的),关于 JSON 与 JS 对象的关系,百度百科里面给出了一个比较:

1
2
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

但是我们现在手头上的工具是 insheetjson,如何把这个 JS 对象转换为 JSON 呢?

先下载下来再说吧!

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这个 temp.json 文件里面只有一行,245 万个字符,这样的文件是不能直接使用 infix 之类的命令读入 Stata 的,我们可以使用 mata 程序处理它,处理的模板就是将它变成一个 json:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

处理之后我们得到了一个 temp2.json 文件,这个文件就是一个 JSON 数据了:

我们先给这个文件转下码,因为我注意到里面有乱码:

1
utrans temp2.json

utrans 是我写的一个非常简单的小命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*! utf-8中文转码
*! utrans 文件名.后缀名
*! 示例:utrans temp.do
cap prog drop utrans
prog define utrans
version 14.0
syntax anything
cap preserve
clear
cap qui{
unicode encoding set gb18030
unicode translate "`anything'"
unicode erasebackups, badidea
unicode analyze "`anything'"
unicode erasebackups, badidea
}
if r(N_needed) == 0 di in yellow "转码完成"
if r(N_needed) != 0 di in red "转码失败"
end

查看响应:

1
insheetjson using "temp2.json", showresponse flatten

存储为 Stata 数据:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

是不是感觉超酷,因为我们知道爬虫俱乐部写了个 cnstock 命令:

1
2
* 安装 cnstock
tssc install cnstock

不过这个命令只能获取股票的代码和名称,我们这段程序呢,可以获取股票的详细信息!那我们不编一个命令是不是可惜了?

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

注意 Stata 命令里面的 ado 代码和 mata 代码要分开,不能直接在 ado 代码里面嵌入 mata 代码块,因为 ado 命令是以 end 为识别标志结束的。

然后运行:

1
2
3
4
cnstock2
*> 下载中...
*> File temp2.json (text file)
*> 获取成功...

获取的结果:

是不是超酷!

作业

案例三就是大家要完成的作业,不要忘记哈!

知识星球附件链接:https://t.zsxq.com/6EIq7me

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×