好好学习 天天向上
爬虫俱乐部之前推出的线下培训,得到了各位老师的一致好评。为了更加方便大家学习,满足更多Stata用户的学习需求,爬虫俱乐部已隆重推出在线直播课程,请大家奔走相告!课程报名链接:https://ke.qq.com/course/286526#tuin=9735fd2d,详情见推文《爬虫俱乐部隆重推出网上直播课程第一季》
有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
好消息:爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!
大家想要的机构持股数据,去“国泰安”他们家,不好搞;敲开“万德”他们家,也不好弄;万一自己家还没有这些数据库,更是要痛哭流涕啦。想不想花5分钟时间,就得到完整的机构持股数据呢?今天教大家把这些好东西“搬”出来。
我们首先打开新浪财经网页进入数据中心,机构持股汇总页面,选择年份为2016年年报,点击第四页:
http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?symbol=%D6%A4%C8%AF%BC%F2%B3%C6%BB%F2%B4%FA%C2%EB&reportdate=2016&quarter=4&p=4
页面如下图所示:其中红框标注的是我们想要的指标。

现在我们一步一步进行分析:
第一步,copy命令抓取网页源代码并转码
我们以抓取2016年年报第4页为例。
clear
cap mkdir E:/机构持股
cd E:/机构持股
copy"http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?symbol=%D6%A4%C8%AF%BC%F2%B3%C6%BB%F2%B4%FA%C2%EB&reportdate=2016&quarter=4&p=4" temp.txt,replace
unicode encoding set gb18030
unicode translate temp.txt, transutf8
unicode erasebackups, badidea
第二步,读入txt中所含信息
我们打开其网页源代码,通过分析我们找到所需信息的源代码的位置如下:

读入数据,保留含有字符串“</td>”的观测值。
infix strL v 1-20000 using temp.txt,clear
keep if index(v, "</td>") //只保留含有</td>字符行的内
第三步,进行简化
上一步,我们已经把所含信息的网页内容读入到Stata中了,这一步,我们进一步简化信息。
首先,我们删除在变量v中匹配到“onclick=”或者以“<td>”开头,以“</td>”结尾或者“.join”或者只含有"</td>"标签的观测值;
其次,把所有的HTML标签(尖括号以及尖括号里边的内容)删除掉。
drop if ustrregexm(v,"onclick=|^<td>\D+</td>$|.join") | v =="</td>"
replace v =ustrregexra(v,"<.*?> ","")

我们发现,在删除掉HTML标签之后,仍然有字符串“<ahref="javascript:void(0);"”和多余的“空格”存在,再次进行删除:
replace v =ustrregexra(v,"<.*|\s+","")
删除无用信息后,得到下图:我们发现这些信息是有规律可循的,即每8行就是我们所需要的信息。

forvalues j = 1/7 {
genv`j' = v[_n + `j']
}
keep if mod(_n, 8) == 1
这样我们就生成了八列变量,同时进行了重命名,上述一列变多列的方法我们在之前的推文多次讲过,这里不再赘述。
最后,变量重命名,并保存数据。
rename(v - v7) (证券代码证券简称机构数机构数变化持股比例持股比例增幅占流通股比例占流通股比例增幅)
save 机构持股,replace

附2008年-2017年版完整程序:
clear
cap mkdir E:/机构持股
cd E:/机构持股
forvalue i = 2008(1)2017 {
forvalue j = 1(1)100 {
clear
cap copy "http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?symbol=%D6%A4%C8%AF%BC%F2%B3%C6%BB%F2%B4%FA%C2%EB&reportdate=`i'&quarter=4&p=`j'" temp.txt,replace
while_rc != 0 {
sleep 6000
cap copy "http://vip.stock.finance.sina.com.cn/q/go.php/vComStockHold/kind/jgcg/index.phtml?symbol=%D6%A4%C8%AF%BC%F2%B3%C6%BB%F2%B4%FA%C2%EB&reportdate=`i'&quarter=4&p=`j'" temp.txt,replace
}
cap checksum "temp.txt"
if `r(filelen)' == 29525 {
continue,break
}
unicode encoding set gb18030
unicode translate temp.txt, transutf8
unicode erasebackups, badidea
infixstrL v 1-20000 using temp.txt,clear
keep if index(v, "</td>")
drop if ustrregexm(v, "onclick=|^<td>\D+</td>$|.join") | v =="</td>"
replace v = ustrregexra(v,"<.*?>|<.+?$|\s+","")
forvalues k = 1/7 {
genv`k' = v[_n + `k']
}
keep if mod(_n, 8) == 1
rename (v - v7) (证券代码证券简称机构数机构数变化持股比例持股比例增幅占流通股比例占流通股比例增幅)
save `i'_`j'.dta,replace
}
}
openall
save 机构持股,replace
注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑:王凯丽
技术总编:刘贝贝
往期推文推荐:
2.hello,MySQL--Stata连接MySQL数据库
3.hello,MySQL--odbcload读取MySQL数据
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


