美国上市公司数据免费送!

2018-01-04 司海涛 爬虫俱乐部 爬虫俱乐部

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

stockquote命令可以直接获取美国上市公司的历史交易数据,但是由于雅虎更新了网站,导致这个命令无法使用。雅虎能阻止使用这个命令,但是阻止不了爬虫君啊!

今天小编带大家一块儿抓取美国上市公司的历史交易数据。本篇推文我们以美国苹果公司(AAPL)为例抓取其2010-2016年的历史交易数据。网页链接为(https://finance.yahoo.com/quote/AAPL/history?p=AAPL)。

首先以AAPL公司2016/11/01到2016/12/01一个月的数据为例。我们在下边的编辑框中选择时间,并选择Historical Price以及日交易数据Daily,最后点击Apply。

然后看到上边的链接变为:https://finance.yahoo.com/quote/AAPL/history?period1=1477929600&period2=1480521600&interval=1d&filter=history&frequency=1d

可以看到,当我们选择完具体的日期后,网页链接中增加了几个参数period1=1477929600&period2=1480521600&interval=1d&filter=history&frequency=1d,其中interval=1dfrequency=1d都表示数据间隔为1天,即日交易数据,如果这里选择Weekly,就为周交易数据;filter=history表示历史交易价格;那么我们猜测period1=1477929600&period2=1480521600为选择的起始日期,但是这一长串数字又不是日期的格式,它到底是什么呢?这里其实是以秒为单位的时间戳,下边我们将时间戳转换为对应的时间,具体的转换方法详见推文时间函数Clock(s1,s2[,Y])--时间戳中的应用

dis %tcCCYY-NN-DD_HH:MM clock("1970-01-01","YMD")+8*60*60*1000+1477929600*1000 // 网页上的数字是以秒为单位的,这里用tc函数需要转化为毫秒

dis %tcCCYY-NN-DD_HH:MM clock("1970-01-01","YMD")+8*60*60*1000+1480521600*1000 // 网页上的数字是以秒为单位的,这里用tc函数需要转化为毫秒

可以看到通过时间戳1477929600、1480521600分别对应日期2016-11-01、2016-12-01,即我们选取日期范围。但是大家有没有一个疑问呢?我们知道时间戳是指格林威治时间1970年01月01日00时00分00秒(北 京时间1970年01月01日08时00分00秒)起至现在的总秒数。那么我们访问的国外的网站,在计算时间戳的时候还是按照北京时间去计算,而且得到的 日期还是正确的。why?这是因为我们计算时间戳时所使用的时间是按照电脑系统所选的时间来计算的,比如说小编电脑中设置的时间为北京时间,因此在算时间 戳对应的日期时,格林威治时间1970年01月01日00时00分00秒的基础上加上了8个小时,关于这一点我们会在下篇推文中详细介绍!

接 下来我们考虑如何抓取该数据,首先,经检查源代码中含有对应的数据,所以我们不用去寻找真实链接;其次,当所选日期范围不同时,对应的链接也是会发生变化 的,那么在不考虑防止服务器封IP这种情况时(不用curl去模拟浏览器),我们可以利用copy命令直接抓取网页源代码,问题就在于如何把所选择的日期 转换为对应的时间戳并放到链接中,计算时间戳的方法可以参考推文时间戳的计算——系统参数的简单运用

例如我们计算2016-11-01的时间戳:

disp %12.0g (tc(01Nov2016 00:00:00)-tc(1 jan 1970 08:00:00))/1000

解决了时间戳的问题,那么给定一个日期我们就可以算出它对应的时间戳,也就得到了对应的网页链接,通过copy命令最终拿到网页源代码。这里我们分年份进行抓取,比如我们选取2016/01/01-2016/12/31这个区间:

可以看到在选取相应的日期之后呢,链接也发生了相应的变化。接着我们看一下网页源代码(下面在源代码中检索2016-12-30的开盘价116.65):

我 们发现2016年12月30日的开盘价116.65检索结果有两条,并且发现第一处的数字与网页上的数字116.65是一样的,而第二处是一长串的数字 116.6500015258789,事实上第一处是第二处的四舍五入;并且我们发现,第二处的日期也是时间戳的格式,例如 116.6500015258789前边的1483108200。接着我们又检索了2016-01-04的开盘价102.61,发现只有一处:

也 就是说,源代码中后边的信息是完整的,而前边的信息只是部分的数据。这是为什么呢?由于该网页是异步加载的,所以网页中并没有显示所有的数据,当鼠标往下 滚动时,数据才一步一步显示出来,因此网页源代码中前边的那部分数据只是网页最开始显示出来的数据的源代码; 而后边是一个json格式的数据,其中的数据是完整的,它会随着在网页中滚动鼠标,然后一步一步通过某种算法将时间戳转为对应的日期以及将数值进行四入五 入,即网页中显示出来的数据格式。

那么我们在抓取这个数据的时候有两种做法:


方法一


  选取一个短的时间段(比如按月抓取),这样网页可以在一开始就加载出来所有的数据,相应的源代码中对应的信息也是完整的,但是呢,由于每个月的天数有所差 异,如果从每个月的第一天到最后一天为一个月进行循环,需要设定一个复杂的程序去设定不同的月份,当然,我们可以从第一个月的1号到下一个的1号这样一个 区间为一个月,到最后再进行剔除重复值。

方法二


 直接按年份进行抓取,对源代码中下边完整的数据进行提取并处理,只需将里边的时间戳转换为对应的日期即可。(当然如果需要对其他数值四舍五入,并保留两位小数,进行修改即可。)

下边我们用第二种方法进行抓取:

将年份、月份以日月年的顺序放到tc()函数中计算时间戳,我们从某一年的1月1日和该年的12月31日转换为对应的时间戳。

local period1 = (tc(01-01-`year' 00:00:00)-tc(1 jan 1970 08:00:00))/1000

local period2 = (tc(31-12-`year' 00:00:00)-tc(1 jan 1970 08:00:00))/1000

其中period1、period2即为起始日期对应的时间戳

完整程序如下(抓取2010-2016年苹果公司数据的源代码):

clear

cap mkdir e:/数据/

cap mkdir e:/数据/雅虎/

cd e:/数据/雅虎/

forvalue year = 2010(1)2016 {

       local period1 = (tc(01-01-`year' 00:00:00)-tc(1 jan 1970 08:00:00))/1000

       local period2 = (tc(31-12-`year' 00:00:00)-tc(1 jan 1970 08:00:00))/1000

       cap copy "https://finance.yahoo.com/quote/AAPL/history?period1=`period1'&period2=`period2'&interval=1d&filter=history&frequency=1d" `year'.txt,replace

       while _rc != 0 {

              sleep 6000

              cap copy "https://finance.yahoo.com/quote/AAPL/history?period1=`period1'&period2=`period1'&interval=1d&filter=history&frequency=1d" `year'.txt,replace

       }     

       dis `year'

    

运行结果如下图所示:

如果你想抓取美国所有上市公司的数据,你只需要有一个公司的列表, 对链接中的(https://finance.yahoo.com/quote/AAPL/history?period1=`period1'&period2=`period2'&interval=1d&filter=history&frequency=1d)公司名称进行循环即可!

由于处理源代码部分涉及到如何将时间戳转换为对应的日期,篇幅限制,源代码处理部分我们将会在下篇推文中进行介绍,请继续关注我们的公众号!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑徐露露

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.如何从pdf中提取表格数据

8.爬虫俱乐部出品——获取上市公司数据的利器

9.爬虫俱乐部出品——实证结果输出命令

10.Putpdf--神奇的转换工具



关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号

公开收集正在保存拖拽至此处以完成收集私密