利用EntityFramework获得双色球数据库

原文 利用EntityFramework获得双色球数据库

双色球想必大家都很熟悉了,尽管屡买屡不中,但还是会买。以前就想过利用双色球的走势图得到双色球的数据库,至于得到数据库干什么倒没想过,不过对以往号码有没有重复出现还是挺好奇的。最近写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的结构。

下图是走势图的html结构,可以看到图表数据在id为chartsTable的表格里。进一步查看,真正有用的数据是在<tbody></tbody>标签中。

下面给出获取<tbody></tbody>之间内容的代码:

   1:          /// <summary>
   2:          /// 获取网页的双色球数据
   3:          /// </summary>
   4:          /// <param name="startQH">开始期号</param>
   5:          /// <param name="endQH">截止期号</param>
   6:          /// <returns></returns>
   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("<tbody id=\"cpdata\">");
  17:              int endIndex = content.IndexOf("</tbody>");
  18:              content = content.Substring(startIndex, endIndex - startIndex).Replace("<tr class=\"bg_doe\" >", "<tr>").Replace("<tr >", "<tr>").Replace("\r\n", "");
  19:              return content;
  20:          }

<tbody></tbody>中的内容就是<tr></tr>和<td></td>了,下面给出解析<tr>和<td>的代码,有注释,就不多解释了。

   1:          /// <summary>
   2:          /// 循环解析Tr
   3:          /// </summary>
   4:          /// <param name="wnRepo"></param>
   5:          /// <param name="content"><tbody></tbody>之间的内容</param>
   6:          private void ResolveTr(IRepository<WinNo> wnRepo, string content)
   7:          {
   8:              string trContent = string.Empty;
   9:              WinNo wn = null;
  10:              Regex regex = new Regex("<tr>");
  11:              //在<tbody></tbody>之间的内容搜索所有匹配<tr>的项
  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:                  //最后一个<tr>的匹配项
  22:                  else
  23:                  {
  24:                      trContent = content.Substring(item.Index, content.Length - item.Index);
  25:                  }
  26:                  ResolveTd(wn, trContent);
  27:                  wnRepo.Insert(wn);
  28:              }
  29:          }
  30:          /// <summary>
  31:          /// 在一个TR中,解析TD,获取一期的号码
  32:          /// </summary>
  33:          /// <param name="wn"></param>
  34:          /// <param name="trContent"></param>
  35:          private void ResolveTd(WinNo wn, string trContent)
  36:          {
  37:              //匹配期号的表达式
  38:              string patternQiHao = "<td align=\"center\" title=\"开奖日期";
  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 = "<td class=\"chartBall02\">";
  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 = "<td class=\"chartBall01\">";
  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 = "<td class=\"chartBall07\">";
  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 WinNo
   2:      {
   3:          /// <summary>
   4:          /// 主键
   5:          /// </summary>
   6:          public int ID { get; set; }
   7:          /// <summary>
   8:          /// 期号
   9:          /// </summary>
  10:          public string QiHao { get; set; }
  11:   
  12:          /// <summary>
  13:          /// 第一个红球号码
  14:          /// </summary>
  15:          public int R1 { get; set; }
  16:          /// <summary>
  17:          /// 第二个红球号码
  18:          /// </summary>
  19:          public int R2 { get; set; }
  20:          /// <summary>
  21:          /// 第三个红球号码
  22:          /// </summary>
  23:          public int R3 { get; set; }
  24:          /// <summary>
  25:          /// 第四个红球号码
  26:          /// </summary>
  27:          public int R4 { get; set; }
  28:          /// <summary>
  29:          /// 第五个红球号码
  30:          /// </summary>
  31:          public int R5 { get; set; }
  32:          /// <summary>
  33:          /// 第六个红球号码
  34:          /// </summary>
  35:          public int R6 { get; set; }
  36:          /// <summary>
  37:          /// 篮球号码
  38:          /// </summary>
  39:          public int B { get; set; }
  40:      }

其次,使用默认配置即可。

第三,新建一个上下文:SSQContext,代码如下:

   1:      public class SSQContext : DbContext
   2:      {
   3:          public SSQContext()
   4:          {
   5:              //Database.SetInitializer(new DropCreateDatabaseAlways<SSQContext>());
   6:              Database.SetInitializer<SSQContext>(null);
   7:          }
   8:   
   9:          public DbSet<WinNo> WinNos { get; set; }
  10:   
  11:          protected override void OnModelCreating(DbModelBuilder modelBuilder)
  12:          {
  13:              modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  14:              base.OnModelCreating(modelBuilder);
  15:          }
  16:      }

第四,运行程序,结果如下图所示:

时间: 2024-08-28 23:44:37

利用EntityFramework获得双色球数据库的相关文章

【RMAN】利用备份片还原数据库(中)

[RMAN]利用备份片还原数据库 [RMAN]利用备份片还原数据库(上): http://blog.itpub.net/26736162/viewspace-1621581/ 在上一篇blog中我们介绍了采用dbms_backup_restore来找回控制文件并恢复整个数据库的方法,本篇blog我们介绍采用创建临时库来找回控制文件的方法. 1.1.1  方法二:尝试采用创建临时库来找回控制文件 由于RMAN必须工作在MOUNT模式,所有的数据文件都丢失,无法通过只重建控制文件将其启动到MOUNT

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条

MVC3、如何应用EntityFramework 连接MySql 数据库

原文:MVC3.如何应用EntityFramework 连接MySql 数据库 新的一年,新的开始. 今天总结的主题是在MySql中应用EntityFramework 的Code First模式. 开发环境:Win8 + MySql5.5 +VS 2012. 第一步是在数据库中新建一个表,具体字段如下图. 在表中添加若干数据: 数据建好之后,下面就是在项目中引用EntityFramework了. 二,在项目中新建一个实体类Product public class Product    {    

【RMAN】利用备份片还原数据库(上)

[RMAN]利用备份片还原数据库 群里有同学说把ORACLE_BASE目录删掉了,现在只有备份片和归档文件了,试问如何恢复.坑,,,,咋能这么干,ORACLE_BASE都敢删,,试着恢复了下,并且记录下来,当然软件安装部分就不记录了. 我再说说目前的情况,只有备份片和归档文件,且从文件名称是看不出dbname和dbid的,在这种情况下其实恢复控制文件是很重要的了,但是鬼知道备份片里边是不是有控制文件的备份呢?我们可能碰到的就是这样的情况,只有备份文件,其它的什么都不知道.我们且看这样的情况下如何

【RMAN】利用备份片还原数据库(下)

[RMAN]利用备份片还原数据库 [RMAN]利用备份片还原数据库(上): http://blog.itpub.net/26736162/viewspace-1621581/ [RMAN]利用备份片还原数据库(中):http://blog.itpub.net/26736162/viewspace-1621661/ 在上2篇blog中介绍了备份片中含有控制文件的备份的情况下,如何从备份集中找回控制文件的备份并恢复数据库,本篇blog来介绍下在备份片中没有控制文件的备份的情况下如何恢复数据库. 1.

利用Xtrabackup进行mysql数据库的备份

利用Xtrabackup来实现数据库的备份 Xtrabackup是有percona公司开发的一款开源备份工具,它与ibbackup这个备份工具不同的是.ibbackup是一个收费的备份工具,而且在其备份性能上,ibbackup不如Xtrabackup.ibbackup和Xtrabackup都对Innodb存储引擎支持在线物理完全备份和在线物理增量备份,对MyISAM存储引擎来说,只支持温备份而已.更对关于两者的特性比较,请参考http://www.percona.com/software/per

【RMAN】利用备份片还原数据库(中)

[RMAN]利用备份片还原数据库       blog文档结构图:      [RMAN]利用备份片还原数据库(上): http://blog.itpub.net/26736162/viewspace-1621581/    在...yuedu.baidu.com/album/view/a9e914106c175f0e7cd13760/2015-05-11 yuedu.baidu.com/album/view/a9e914106c175f0e7cd13760.html/2015-05-11 yu

利用JDBC连接到数据库

利用JDBC连接到数据库一般需要几个步骤: 1.装载驱动程序. 2.建立连接. 3.发送和执行SQL语句. 4.释放资源 首先建立一个数据库: 脚本如下: 1 create database csdn; 2 use csdn; 3 -- 创建用户表 4 CREATE TABLE USERS 5 ( 6 ID INT(7) NOT NULL AUTO_INCREMENT, 7 NAME VARCHAR(50) , 8 PWD VARCHAR(50), 9 PHONE VARCHAR(50) , 1

利用接口实现多种数据库类型的灵活更换

当存在可能要更换数据库类型的时候,要考虑两个问题: 一,不同类型的数据库命名空间不一样,用到的函数名也不一样,尽管很相似: 二,有些SQL语句在不一样的数据库之间是不通用的! 那么要在更换数据库类型的时候,如何做到尽量少受因为上面两点而造成的影响呢?!利用接口,可以将第一点的影响降到最低!至于第二点, 可以将数据的操作尽量在数据库服务器端实现,这点的探讨不在本文研究范围内,在此也就不多说!下面主要就利用接口将第一点的影响降到最低这一点进行详细说 明. 首先,明确两点: 1, 无论哪种数据库类型,