|
最近在学习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 <- &#34;http://datachart.500.com/dlt/history/newinc/history.php?start=00001&end=19001&#34; %>%
url_escape(reserved = &#34;][!$&&#39;()*+,;=:/?@#&#34;)
page <- read_html(url) ## 读入网页内容
node <- html_nodes(page, &#39;.t_tr1&#39;) ## 抓取节点
node <- node[grep(&#39;cfont&#39;, node)] ## 进一步筛选节点
trim <- function(x) {
a1 <- unlist(strsplit(as.character(x), &#39; &#39;))
a2 <- gsub(&#39;>|<|,&#39;,&#39;&#39;,str_extract_all(a1,&#34;>.*<&#34;))
a3 <- a2[3:length(a2)]
return(a3)
}
Leto <- as.data.frame(do.call(&#39;rbind&#39;, 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(&#39;期号&#39;,&#39;红球1&#39;,&#39;红球2&#39;,&#39;红球3&#39;,&#39;红球4&#39;,&#39;红球5&#39;,&#39;蓝球1&#39;,&#39;蓝球2&#39;,
&#39;奖池&#39;,&#39;一等奖注数&#39;,&#39;一等奖奖金&#39;,&#39;二等奖注数&#39;,&#39;二等奖奖金&#39;,
&#39;全部奖金&#39;,&#39;开奖日期&#39;)在读入网页内容,抓取并筛选节点之后,就要对数据进行修修剪剪了。我这里定义了一个trim函数,可以只留下数字的信息。结果如下:
从2007年001期到现在,一共进行了1734期,那么,群众们参与的热情度高不高呢?
可见,大乐透的奖池金额由2007年的不足1亿,增长到2018年的60多亿,增长了60多倍。尤其是2014年之后,群众们购买彩票的热情迅速膨胀。那么,派发的奖金金额在这十年间有什么变化呢?
10年间,派发的奖金由2000万近乎匀速地增长到2亿元,增加了10倍。
下一步,让我们看看大家比较关心的一等奖金额在这10年间有着怎样的变化呢?
2007年至今,一等奖的单注金额都稳定在500-1000万的区间内,只有极少数几期的奖金超出或低于这个范围。
只是利用大乐透的数据做了简单的分析,看官们如果觉得满意,就顺手点个赞呗,让我们互相学习。
<hr/>文 | 索罗斯的书屋,全流程数据分析师,财经数据爱好者,原创不易,转载请注明版权。 |
|