最近在学习R爬虫,想找些格式简单的数据练练手,于是就想到了彩票数据,下面分享一波我爬取大乐透数据的经历。
首先,数据来源:http://datachart.500.com/dlt/history/history.shtml【超级大乐透历史数据】。
网页数据看起来很工整的样子,是个不错的练手对象。
然后,右键->查看网页源代码,搜索“期号”,很快就发现中奖信息所在的区域。但令人郁闷的是,这里只显示了最近30期的数据。于是,返回点击“最近100期”,再查看源代码,发现还是只显示了最近30期的数据。
因此,我们看到的网页并非数据的存储页,而是展示页。于是,右键->检查,在网页操作,查看00001期至19001期,在network下找到了真正存储数据的页面:http://datachart.500.com/dlt/history/newinc/history.php?start=00001&end=19001
点进去发现2007年至今的所有数据都在,真是太好了。
接下来就是抓取过程,我使用的是rvest包,代码如下:
## Get history Letto data library(rvest) library(stringr) library(dplyr) url <- "http://datachart.500.com/dlt/history/newinc/history.php?start=00001&end=19001" %>% url_escape(reserved = "][!amp;'()*+,;=:/?@#") page <- read_html(url) ## 读入网页内容 node <- html_nodes(page, '.t_tr1') ## 抓取节点 node <- node[grep('cfont', node)] ## 进一步筛选节点 trim <- function(x) { a1 <- unlist(strsplit(as.character(x), ' ')) a2 <- gsub('>|<|,','',str_extract_all(a1,">.*<")) a3 <- a2[3:length(a2)] return(a3) } Leto <- as.data.frame(do.call('rbind', lapply(node, trim)), stringsAsFactors = FALSE) for(i in 2:14) { Leto[,i] <- as.numeric(Leto[,i]) } Leto[,15] <- as.Date(Leto[,15]) colnames(Leto) <- c('期号','红球1','红球2','红球3','红球4','红球5','蓝球1','蓝球2', '奖池','一等奖注数','一等奖奖金','二等奖注数','二等奖奖金', '全部奖金','开奖日期')
在读入网页内容,抓取并筛选节点之后,就要对数据进行修修剪剪了。我这里定义了一个trim函数,可以只留下数字的信息。结果如下:
从2007年001期到现在,一共进行了1734期,那么,群众们参与的热情度高不高呢?
可见,大乐透的奖池金额由2007年的不足1亿,增长到2018年的60多亿,增长了60多倍。尤其是2014年之后,群众们购买彩票的热情迅速膨胀。那么,派发的奖金金额在这十年间有什么变化呢?
10年间,派发的奖金由2000万近乎匀速地增长到2亿元,增加了10倍。
下一步,让我们看看大家比较关心的一等奖金额在这10年间有着怎样的变化呢?
2007年至今,一等奖的单注金额都稳定在500-1000万的区间内,只有极少数几期的奖金超出或低于这个范围。
只是利用大乐透的数据做了简单的分析,看官们如果觉得满意,就顺手点个赞呗,让我们互相学习。
“大乐透”系列文章传送门:
文 | 招财喵zcm,全流程数据分析师,财经数据爱好者,原创不易,转载请注明版权。