最近有小伙伴想爬取和讯网的上市公司列表然后绘图展示各省上市公司数量:http://stockdata.stock.hexun.com/gszl/jbgk.aspx
![]()
实际上在之前的系列课程「Stata 编程导论」的 <8. Stata网络数据爬取:JSON篇> 中讲解过这个案例,今天我们再单独看一下。
通过网页分析(Fn + F12)可以看到这个表格对应的数据在这里:
![]()
对应的链接是这个:
http://stockdata.stock.hexun.com/gszl/data/jsondata/jbgk.ashx?count=20&titType=null&page=1&callback=hxbase_json15 |
显然这里的 20 表示每页显示 20 条,可以改成 5000:
http://stockdata.stock.hexun.com/gszl/data/jsondata/jbgk.ashx?count=5000&titType=null&page=1&callback=hxbase_json15 |
这个数据看起来像是 JSON 数据,但它其实不是一个 JSON 数据,而是个 JS 对象(带回掉函数的),关于 JSON 与 JS 对象的关系,百度百科里面给出了一个比较:
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的 |
JSON 数据的处理可以使用 insheetjson 命令,如何把这个 JS 对象转换为 JSON 呢?
先下载下来:
copy "http://stockdata.stock.hexun.com/gszl/data/jsondata/jbgk.ashx?count=5000&titType=null&page=1&callback=hxbase_json15" "temp.json", replace |
这个 temp.json 文件里面只有一行,245 万个字符,这样的文件是不能直接使用 infix 之类的命令读入 Stata 的,我们可以使用 mata 程序处理它,处理的模板就是将它变成一个 json:
mata: |
处理之后我们得到了一个 temp2.json 文件,这个文件就是一个 JSON 数据了:
我们先给这个文件转下码,因为我注意到里面有乱码:
utrans temp2.json |
utrans 是我写的一个非常简单的小命令:
*! utf-8中文转码 |
查看响应:
insheetjson using "temp2.json", showresponse flatten |
存储为 Stata 数据:
clear |
是不是感觉超酷,因为我们知道爬虫俱乐部写了个 cnstock 命令(该命令爬取的就是上次课的最后一个案例,最近这个命令挂了):
*- 安装 cnstock(就别安装了) |
不过这个命令只能获取股票的代码和名称,我们这段程序呢,可以获取股票的详细信息!那我们不编一个命令是不是可惜了?
*! 微信公众号 RStata |
注意 Stata 命令里面的 ado 代码和 mata 代码要分开,不能直接在 ado 代码里面嵌入 mata 代码块,因为 ado 命令是以 end 为识别标志结束的。
另外注意这里的代码和前面的代码有几处不同:
- ado 里面尽量不要下载文件到本地,而应该使用临时文件:tempfile filein fileout;
- unicode encoding set gb18030、unicode translate “文件名”、unicode erasebackups, badidea 或者 utrans 命令只能转码工作目录下面的文件,因此这里使用的是 line = ustrfrom(line, “GBK”, 4) 进行转码。
- 把这部分代码保存为 cnstock3.ado 即可使用。
然后运行:
cnstock3 |
然后我们就可以根据里面的 district 变量统计各省上市公司的数量并绘图展示了:
use cnstock3, clear |
![]()
如果想要根据柱条的高度排序,可以使用 sencode 命令:
*- 安装 sencode: ssc install sencode |
![]()
反过来排序也可以:
sencode district, gen(district4) gsort(-_freq) |
![]()
点击这里跳转到 RStata 短书平台获取附件:Stata 如何爬取所有 A 股上市公司的基本信息并展示地域分布?
评论