Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者: 李岸瑶 (华南师范大学)
邮箱: 1347396814@qq.com
目录
在上一篇中,我们已经讲解了如何爬取「地区宏观数据」。在本文中,我们将以爬取「A股所有公司基本概况一览表」数据为例,讲解如何使用 Stata 进行网页表格数据爬取。
我们在其中能找到这样一个链接,通过复制粘贴到浏览器,可以发现该链接下存放的是数据。具体链接形式如下:
经分析发现,上述 URL 中的 p = 2 就是关键,将 2 替换成具体页数,就能返回对应页数据的源代码。
capt mkdir "./A股所有公司基本概况一览表"
cd "./A股所有公司基本概况一览表"
forv i=1(1)220{
*注意:引号中的文本不能换行,这里为了展示方便,对链接内容进行了换行,
*读者在练习时,可删除换行符,将链接内容放到一行
copy "http://stockdata.stock.hexun.com/gszl/data/jsondata/jbgk.ashx? ///
count=20&on=&titType=null&page=`i'&callback=hxbase_json15" ///
"temp`i'.txt", replace
}
由于这个网页没有设置反爬机制,所以可以直接使用 copy
命令进行下载。运用循环语句 forvalue
对前 220 页表格的信息进行下载。
第一步:合并所有已下载的 txt 文件,具体过程如下:
type *.txt > all.txt
,将所有 txt 文件全部合并成一个 all.txt,注意 type
和 *
之间有空格,写完保存;.txt
改为 .bat
;第二步:txt 文档中插入转行。观察到 all.txt 中的内容并无转行,为了方便 Stata 处理数据,需插入转行。具体步骤如下:
^p shtml',Stockname
替换所有 shtml',Stockname
;第三步:读入 all.txt 文件。数据结构如下图所示:
infix strL v 1-20000 using all.txt, clear
format v %500s
replace v = ustrfrom(v, "gb18030", 1)
第四步:解决乱码问题。若数据导入 Stata 后,文字无法正常显示,即出现乱码问题。在这里,我们可用下面命令解决乱码问题。若文字显示正常,则不需运行以下命令。
replace v = ustrfrom(v, "gb18030", 1)
通过分析可以发现,表格中每一行的数据在源代码中都是单独位于一行的。为此,我们将利用正则表达式提取对应信息。关于正则表达式的介绍,请参考相关推文「正则表达式和文本分析」。
*利用正则匹配对应字符串
gen 公司名称_代码 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Stockname:').+(?=',Pricelimit)")
gen 总股本_亿股 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Pricelimit:').+(?=',lootchips)")
gen 流通股本_亿股 = ustrregexs(0) ///
if ustrregexm(v, "(?<=lootchips:').+(?=',shareholders)")
gen 流通市值_亿元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=shareholders:').+(?=',Institutional)")
gen 注册资本_万元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Institutional:').+(?=',Iratio)")
gen 市盈率_倍 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Iratio:').+(?=',deviation)")
gen 所属行业 = ustrregexs(0) ///
if ustrregexm(v, "(?<=>).+(?=</a>',maincost)")
gen tmp = ustrregexs(0) if ustrregexm(v, "(?<=>).+(?=</a><)")
gen 所属概念 = ustrregexs(0) if ustrregexm(tmp, `"(?<=blank">).+"')
drop tmp
gen tmp = ustrregexs(0) if ustrregexm(v, `"(?<=blank">).+(?=</a>)"')
gen 所属地域 = ustrregexs(0) ///
if ustrregexm(tmp, `"(?<=jdy-3..000000.shtml target="_blank">).+"')
drop tmp
gen 收盘价_元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Cprice:').+(?=',Stockoverview)")
drop v
drop in 1
*导出数据
export excel using "A股所有公司基本概况一览表.xlsx", firstrow(var) replace
shellout using "A股所有公司基本概况一览表.xlsx"
以下方法不用借助任何第三方工具,完全依靠 Stata 完成,具体代码如下:
forvalues i = 1(1)220{
infix strL v 1-20000 using "temp`i'.txt", clear
format v %500s
replace v = ustrfrom(v, "gb18030", 1)
split v, p("},")
insobs 20
forvalues j = 1(1)20{
replace v = v`j'[1] in `j'
}
keep v
save "temp`i'.dta", replace
}
use temp1.dta, clear
forvalues i = 2(1)220{
append using "temp`i'.dta"
}
drop if v == ""
*利用正则匹配对应字符串
gen 公司名称_代码 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Stockname:').+(?=',Pricelimit)")
gen 总股本_亿股 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Pricelimit:').+(?=',lootchips)")
gen 流通股本_亿股 = ustrregexs(0) ///
if ustrregexm(v, "(?<=lootchips:').+(?=',shareholders)")
gen 流通市值_亿元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=shareholders:').+(?=',Institutional)")
gen 注册资本_万元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Institutional:').+(?=',Iratio)")
gen 市盈率_倍 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Iratio:').+(?=',deviation)")
gen 所属行业 = ustrregexs(0) ///
if ustrregexm(v, "(?<=>).+(?=</a>',maincost)")
gen tmp = ustrregexs(0) if ustrregexm(v, "(?<=>).+(?=</a><)")
gen 所属概念 = ustrregexs(0) if ustrregexm(tmp, `"(?<=blank">).+"')
drop tmp
gen tmp = ustrregexs(0) if ustrregexm(v, `"(?<=blank">).+(?=</a>)"')
gen 所属地域 = ustrregexs(0) ///
if ustrregexm(tmp, `"(?<=jdy-3..000000.shtml target="_blank">).+"')
drop tmp
gen 收盘价_元 = ustrregexs(0) ///
if ustrregexm(v, "(?<=Cprice:').+(?=',Stockoverview)")
drop v
drop in 1
save A股所有公司基本概况一览表.dta, replace
forvalues i = 1(1)220{
erase "temp`i'.dta"
}
Note:产生如下推文列表的 Stata 命令为:
lianxh 正则 爬虫 文本, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh