Stata爬虫:爬取A股公司基本信息

发布时间:2021-07-18 阅读 4026

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 李岸瑶 (华南师范大学)
邮箱: 1347396814@qq.com


目录


在上一篇中,我们已经讲解了如何爬取「地区宏观数据」。在本文中,我们将以爬取「A股所有公司基本概况一览表」数据为例,讲解如何使用 Stata 进行网页表格数据爬取。

1. 网页分析

  • 使用浏览器为 Win10 自带 Microsoft Edge 打开网址;
  • 点击鼠标右键,“审查元素 (检查)”;
  • 找到 “网络” 选项,点击一下;
  • 点击 A 股所有公司基本概况一览表的第二页;
  • 可以看到有很多内容从网站服务器上 load 出来,那是加载第二页的网页信息源。
图 1:获取信息源
图 1:获取信息源

我们在其中能找到这样一个链接,通过复制粘贴到浏览器,可以发现该链接下存放的是数据。具体链接形式如下:

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

经分析发现,上述 URL 中的 p = 2 就是关键,将 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 页表格的信息进行下载。

3. 数据读入

第一步:合并所有已下载的 txt 文件,具体过程如下:

  • 在 “A股所有公司基本概况一览表” 文件夹中新建一个 txt 文件;
  • 输入 type *.txt > all.txt,将所有 txt 文件全部合并成一个 all.txt,注意 type* 之间有空格,写完保存;
  • 然后将该 txt 文档的格式后缀 .txt 改为 .bat
  • 双击运行,所有数据储存于 all.txt。

第二步:txt 文档中插入转行。观察到 all.txt 中的内容并无转行,为了方便 Stata 处理数据,需插入转行。具体步骤如下:

图 2:观察何处插入转行
图 2:观察何处插入转行
  • 对比文档内容与表格内容后,选择在 “shtml',Stockname” 前插入转行;
  • 将文档内容剪切到 Word 中;
  • ^p shtml',Stockname 替换所有 shtml',Stockname
  • 随后复制到 all.txt 文档中。

第三步:读入 all.txt 文件。数据结构如下图所示:

infix strL v 1-20000 using all.txt, clear
format v %500s
replace v = ustrfrom(v, "gb18030", 1)
图 3:数据的雏形
图 3:数据的雏形

第四步:解决乱码问题。若数据导入 Stata 后,文字无法正常显示,即出现乱码问题。在这里,我们可用下面命令解决乱码问题。若文字显示正常,则不需运行以下命令。

replace v = ustrfrom(v, "gb18030", 1)

4. 数据处理

通过分析可以发现,表格中每一行的数据在源代码中都是单独位于一行的。为此,我们将利用正则表达式提取对应信息。关于正则表达式的介绍,请参考相关推文「正则表达式和文本分析」

*利用正则匹配对应字符串
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"
图 4:结果展示
图 4:结果展示

5. 补充方法

以下方法不用借助任何第三方工具,完全依靠 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"
}

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 正则 爬虫 文本, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh