使用到的包是RCurl,通过这个包可以做一些网页讯息的抓取
先通过新浪财经的入口,选一只感兴趣的股票,再点击左边行情走势下的历史交易得到历史交易数据
常用的浏览器可以打开网页讯息的源代码:
首先读取包并用,读取该网址的信息,并按行对信息进行切割:
library(RCurl)temp<-getURL(url)k=strsplit(temp,"\r\n")[[1]]
可以看到相关的源代码信息,在每一个周期内都有一个<a target='_blank' 格式的脚本,可以以此为匹配的原则用grep函数提取相关的信息,并且在读取该行发现,该行的下行有直接出现日期信息,可以在出现的列表中的采用+1直接读取下一行的时间信息:
date<-k[grep("<a target='_blank'",k)+1]
会读取到类似这样格式的有关时间讯息,接着对时间讯息进行切割,\t占用了一个位置,由此可以数的关于时间开始使是由第4位到第13位
date<-substring(date,4,13)
读取到的关于时间的讯息
同理,开盘价、收盘价、最高价也可通过相应的方法读取到相关信息:
kaipan<-k[grep("<a target='_blank'",k)+3]gregexpr(">\\d+",kaipan)kaipanjia<-substring(kaipan,28,33)zuigao<-k[grep("<a target='_blank'",k)+4]gregexpr(">\\d+",zuigao)zuigaojia<-substring(zuigao,28,33)zuigaojiashoupan<-k[grep("<a target='_blank'",k)+5]shoupanjia<-substring(shoupan,28,33)
其中开盘价之类的会有一个问题在比较难知道对应的数值在哪个位置,可以通过gregexpr函数,通过设定特定的正则匹配,然后返回对应的位置及长度
gregexpr(">\\d+",kaipan)[[1]][1] 27attr(,"match.length")[1] 3attr(,"useBytes")[1] TRUE[[2]][1] 27attr(,"match.length")[1] 3attr(,"useBytes")[1] TRUE[[3]][1] 27attr(,"match.length")[1] 3attr(,"useBytes")[1] TRUE
\d表示任意数字,由于在其中是以>开头,所以数字的起始位置27要+1为28,结束位置为33,故用substring函数取的是对应的第27到33位置的字符串,
但在“”中要用双斜杠预防混乱,最终得到的结果以最高价为例如下:
zuigaojia[1] "40.850" "41.020" "41.690" "41.330" "41.380" "41.750" "41.650"[8] "39.370" "39.090" "39.600" "39.300" "40.550" "41.550"
也可通过以个for循环来读取不同季度的消息,过程与单个季度读取类似,多个paste函数取整合季度的url即可,由于选的年份是,所以季度只有3季,演示如下:
jidu=1:3urllist=paste("http://vip.stock./corp/go.php/vMS_MarketHistory/stockid/000651.phtml?year=&jidu=",jidu,sep="")kaipanjia=0shoupanjia=0date1=0zuigaojia=0
先用季度的值将不同的url连接,为之后的for循环准备,然后将不同变量的初始值设置为0:
for(url in urllist){temp<-getURL(url)k=strsplit(temp,"\r\n")[[1]]date<-k[grep("<a target='_blank'",k)+1]x<-substring(date,4,13)date1<-append(date1,x)kaipan<-k[grep("<a target='_blank'",k)+3]y<-substring(kaipan,28,33)kaipanjia<-append(kaipanjia,y)zuigao<-k[grep("<a target='_blank'",k)+4]z<-substring(zuigao,28,33)zuigaojia<-append(zuigaojia,z)shoupan<-k[grep("<a target='_blank'",k)+5]j<-substring(shoupan,28,33)shoupanjia<-append(shoupanjia,j)Sys.sleep(5)}
为了防止被认定为恶意访问,加上一个每次循环间隔5秒,其中的append函数来累计上一季度的数据:
最终再用一个数据框给包含抓取到的数据
gupiao<-data.frame(date1,kaipanjia,zuigaojia,shoupanjia)
最终数据框的结果,不过要在最后对数据框的第一行减掉,因为在初始的时候给予赋值0,。
相对起来通过url去抓取股票数据会比较麻烦,比专门处理金融的quantmod包麻烦,但可以加深对网页抓取数据的认识
另外在抓取数据时觉得可能编写的循环效率不够高,如果有路过的大神有更好的方法,可以的话留言教下po主