时间:2021-07-01 10:21:17 帮助过:32人阅读
双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买。以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往号码有没有重复出现还是挺好奇的。最近写Entity Framework的博客,所以这篇文章的标题里就出现了Entity F
双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买。以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往号码有没有重复出现还是挺好奇的。最近写Entity Framework的博客,所以这篇文章的标题里就出现了Entity Framework的身影,其实Entity Framework在下面的程序里只占据了很少的一部分。
下面开始介绍我获取数据库的方法。
双色球的走势图网址:http://zx.caipiao.163.com/trend/ssq_basic.html
打开之后,如下图所示,默认显示的是最近30期的:
根据期号进行查询,可以得到如下的链接:
http://zx.caipiao.163.com/trend/ssq_basic.html?beginPeriod=2012110&endPeriod=2012139&historyPeriod=2012140&year=
很容易可以发现beginPeriod表示的是开始期号,endPeriod表示的截止期号。有了这两个参数,就可以得到任意期号的数据了。根据上述方法查询,得到网易彩票提供的最早数据是2004009期。
下面分析走势图的html结构。
谷歌浏览器中,按Ctrl+Shift+i 或Firefox中使用Firebug可查看html的结构。
下面给出获取
之间内容的代码:
1: ///
2: /// 获取网页的双色球数据
3: ///
4: /// 开始期号
5: /// 截止期号
6: ///
7: private string GetOriginData(string startQH, string endQH)
8: {
9: string path = string.Format("http://zx.caipiao.163.com/trend/ssq_basic.html?beginPeriod={0}&endPeriod={1}", startQH, endQH);
10: WebRequest wp = WebRequest.Create(path);
11: Stream s = wp.GetResponse().GetResponseStream();
12: StreamReader sr = new StreamReader(s);
13: string content = sr.ReadToEnd();
14: sr.Close();
15: s.Close();
16: int startIndex = content.IndexOf("");17: int endIndex = content.IndexOf("");
18: content = content.Substring(startIndex, endIndex - startIndex).Replace("", " ").Replace(" ", " ").Replace("\r\n", ""); 中的内容就是19: return content;20: }
和 了,下面给出解析 和 的代码,有注释,就不多解释了。
1: ///2: /// 循环解析Tr3: ///4: ///5: /// 之间的内容6: private void ResolveTr(IRepositorywnRepo, string content) 7: {
8: string trContent = string.Empty;9: WinNo wn = null;10: Regex regex = new Regex(""); 11: //在之间的内容搜索所有匹配的项 12: MatchCollection matches = regex.Matches(content);
13: foreach (Match item in matches)14: {
15: wn = new WinNo();16: //如果当前匹配项的下一个匹配项的值不为空17: if (!string.IsNullOrEmpty(item.NextMatch().Value))18: {
19: trContent = content.Substring(item.Index, item.NextMatch().Index - item.Index);
20: }
21: //最后一个的匹配项 22: else23: {
24: trContent = content.Substring(item.Index, content.Length - item.Index);
25: }
26: ResolveTd(wn, trContent);
27: wnRepo.Insert(wn);
28: }
29: }
30: ///31: /// 在一个TR中,解析TD,获取一期的号码32: ///33: ///34: ///35: private void ResolveTd(WinNo wn, string trContent)36: {
37: //匹配期号的表达式38: string patternQiHao = "; 39: Regex regex = new Regex(patternQiHao);40: Match qhMatch = regex.Match(trContent);
41: wn.QiHao = trContent.Substring(qhMatch.Index + 17 + patternQiHao.Length, 7);
42: //匹配蓝球的表达式43: string patternChartBall02 = ""; 44: regex = new Regex(patternChartBall02);45: Match bMatch = regex.Match(trContent);
46: wn.B = Convert.ToInt32(trContent.Substring(bMatch.Index + patternChartBall02.Length, 2));
47: //存放匹配出来的红球号码48: redBoxList = new List<int>();49: //匹配红球的表达式50: string patternChartBall01 = ""; 51: regex = new Regex(patternChartBall01);52: MatchCollection rMatches = regex.Matches(trContent);
53: foreach (Match r in rMatches)54: {
55: redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall01.Length, 2)));
56: }
57: //匹配红球的表达式58: string patternChartBall07 = ""; 59: regex = new Regex(patternChartBall07);60: rMatches = regex.Matches(trContent);
61: foreach (Match r in rMatches)62: {
63: redBoxList.Add(Convert.ToInt32(trContent.Substring(r.Index + patternChartBall07.Length, 2)));
64: }
65: //排序红球号码66: redBoxList.Sort();
67: //第一个红球号码68: wn.R1 = redBoxList[0];
69: //第二个红球号码70: wn.R2 = redBoxList[1];
71: wn.R3 = redBoxList[2];
72: wn.R4 = redBoxList[3];
73: wn.R5 = redBoxList[4];
74: wn.R6 = redBoxList[5];
75: }
下面给出使用到Entity Framework部分的代码:
首先,新建一个WinNo实体,用于表示双色球信息:
1: public class WinNo2: {
3: ///4: /// 主键5: ///6: public int ID { get; set; }7: ///8: /// 期号9: ///10: public string QiHao { get; set; }11:
12: ///13: /// 第一个红球号码14: ///15: public int R1 { get; set; }16: ///17: /// 第二个红球号码18: ///19: public int R2 { get; set; }20: ///21: /// 第三个红球号码22: ///23: public int R3 { get; set; }24: ///25: /// 第四个红球号码26: ///27: public int R4 { get; set; }28: ///29: /// 第五个红球号码30: ///31: public int R5 { get; set; }32: ///33: /// 第六个红球号码34: ///35: public int R6 { get; set; }36: ///37: /// 篮球号码38: ///39: public int B { get; set; }40: }
其次,使用默认配置即可。
第三,新建一个上下文:SSQContext,代码如下:
1: public class SSQContext : DbContext2: {
3: public SSQContext()4: {
5: //Database.SetInitializer(new DropCreateDatabaseAlways()); 6: Database.SetInitializer(null); 7: }
8:
9: public DbSetWinNos { get; set; } 10:
11: protected override void OnModelCreating(DbModelBuilder modelBuilder)12: {
13: modelBuilder.Conventions.Remove(); 14: base.OnModelCreating(modelBuilder);15: }
16: }
第四,运行程序,结果如下图所示:
本程序的源代码下载地址为:http://www.ef-community.com/forum.php?mod=viewthread&tid=44&extra=page%3D1
人气教程排行
- 355次 1 对数据库模式进行规范化处理,是在数据库设计的什么阶段?
- 355次 2 mysql如何删除多个表格数据库数据
- 355次 3 Oracle购买价格和服务费计算方式
- 355次 4 MYSQL查看和新增表分区
- 354次 5 TRACE32调试技巧
- 353次 6 Oracle数据库教程:ORA-01031:权限不足
- 353次 7 Oracle物化视图失效的几种情况及测试
- 352次 8 mysql-sql语句查询多个字段不等于零怎么写?
- 351次 9 如何提高mysql大批量数据更新(update)的效率?
- 350次 10 mysql如何从ibd文件恢复数据
- 350次 11 ORACLEROLLUP和CUBE函数
- 350次 12 IBMDB2赋权[SQL0551N]
- 350次 13 mysql不等于符号写法
- 349次 14 redhat8mysql安装具体过程_MySQL
- 349次 15 SQLServer出现Error:1326错误(管理器无法连接远程数据库)问题解决方案
- 348次 16 centos下配置mysql数据库自动备份
- 348次 17 MySQL中使用SQL语句对字段进行重命名
- 347次 18 数据库中的表以行和列来组织数据,每一行称为每一列称为
- 347次 19 windowsservice-mysql安装出错,远程调用失败
- 346次 20 SQL连接查询语法及使用