看球这么多年来,一直是在看国内几个网站上的比赛数据,包括球员信息、两队比赛进球数、哪个球员进的球、进球方式是什么。所以最后慢慢的形成了自己的一个思维模式,越到后面就越想让这些比赛的数据可以自动汇总起来。比如有这么一个场景:在周三的晚上,我们回到了家里,正好没有事情,打开电脑,此时电脑的桌面上会弹出一个界面,里面汇总了本周已经结束的五大联赛的比赛进球集锦,可以汇总出我们关注的球队最近比赛的进球者。最为关键的是,会自动汇总出下一场比赛,哪个球员再的一次黄牌就会红牌停赛,哪个球员累计黄牌够了,本场需要停赛。就在此时,我们突然发现有几场比赛有冷门的倾向,此时系统又回给我们自动汇总出这几场比赛的开盘数据、历史数据对比等等,也许里面会有一些类似的地方,如果我们能结合球队最近比赛的视频和数据分析,那对比赛的把握程度应该是很好了。

比如我们会把这样图表自动给我们收集回来,不用我们在去每个网站去一个个找,这样就可以省很多时间。所以我们就需要做一些编程的工作,把这些底层的数据都采集回来。

其实最终采集回来的这些数据还是静态的,这不能给我们提供什么,还需要我们去加工,这就涉及到一系列的工作了,今天我们的第一步就是先把数据采集回来:
string selectDateTime = "SELECT * from [Table_DateTime] where [TimeNode]>='2016-10-20' and [TimeNode]<='2016-11-16' ";
DataTable dataTime = SqlHelper.ExecuteDataSet(CommandType.Text, selectDateTime).Tables[0];
if (dataTime.Rows.Count > 0)
{
foreach (DataRow dr in dataTime.Rows)
{
string id=dr["id"].ToString();
DateTime timeNode = Convert.ToDateTime(dr["TimeNode"].ToString());
InsertData(timeNode.ToString("yyyy-MM-dd"), id);
}
}
public void InsertData(string selectDateTime,string idValue)
{
string dateTime = selectDateTime;
string htmlUrl = "http://odds.500.com/europe_jczq_" + dateTime + ".shtml";
string htmlContent = FCode.HttpHelper.SendGet(htmlUrl);
Regex reg = new Regex("\\r|\\t|\\n|\\a");
string htmlContentRe = reg.Replace(htmlContent, "");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlContentRe);
//获取存储数据的容器内的数据,这里是table 标签里的 tbody
var mainTbody = doc.DocumentNode.SelectSingleNode(@"//*[@id='main-tbody']");
if (mainTbody != null)
{
//获取所有行
var list = mainTbody.SelectNodes(@"tr");
//如果获取的是table,就需要移除第一行表头
//list.RemoveAt(0);
//遍历每一行,获取需要的数据
if (list != null)
{
StringBuilder sqlField = new StringBuilder();
var trID = "";
for (int trData = 0; trData < list.Count; trData++)
{
trID = list[trData].Attributes[0].Value;
var tdList = list[trData].SelectNodes(@"td");
for (int tdData = 0; tdData < tdList.Count; tdData++)
{
//第一行数据
if (tdList.Count == 16)
{
if (tdData != 3 && tdData != 10 && tdData != 11 && tdData != 12 && tdData != 13 && tdData != 14)
{
var firstData = tdList[tdData].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
//sqlInsert.AppendFormat("'{0}',", firstData);
if (tdData == 7 || tdData == 8 || tdData == 9)
{
sqlField.AppendFormat("{0},", firstData);
}
else
{
if (tdData == 15)
{
var OuZhouHtml = tdList[tdData].InnerHtml;
string dataResult = "";
Regex regHtml = new Regex(@"(?is)<a[^>]*?href=(['""\s]?)(?<href>[^'""\s]*)\1[^>]*?>");
MatchCollection match = regHtml.Matches(OuZhouHtml);
foreach (Match m in match)
{
dataResult += m.Groups["href"].Value + ",";
}
string[] arrayHref = dataResult.Split(',');
string OuZhouHtmlNew = "";
for (int i = 0; i < arrayHref.Length; i++)
{
OuZhouHtmlNew = arrayHref[2].ToString();
}
sqlField.AppendFormat("'{0}',", OuZhouHtmlNew);
}
else
{
sqlField.AppendFormat("'{0}',", firstData);
}
}
}
}
//第二行数据
if (tdList.Count == 8)
{
if (tdData != 3 && tdData != 4 && tdData != 5 && tdData != 6 && tdData != 7 && tdData != 8)
{
var secondData = tdList[tdData].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
sqlField.AppendFormat("{0},", secondData);
}
}
}//列数据
if (tdList.Count == 8)
{
sqlField.AppendFormat("{0},", trID);
sqlField.AppendFormat("'{0}')", dateTime);
}
if (tdList.Count == 8)
{
//存入数据库
StringBuilder sqlInsert = new StringBuilder();
sqlInsert.Append(@"INSERT INTO [tb_FootballMatch](
[ChagnCi]
,[SaiShi]
,[LunCi]
,[ZhuChangQiuDui]
,[BiFen]
,[KeChangQiuDui]
,[ChuSheng]
,[ChuPing]
,[ChuFu]
,[OuZhouHtml],[ZhongSheng],[ZhongPing],[ZhongFu],[ChangCiId],[BiSaiShiJiang])VALUES(");
string sql = sqlInsert.ToString() + sqlField.ToString();
SqlHelper.ExecteNonQuery(CommandType.Text, sql);
sqlField = new StringBuilder();
}
}//行数据
//MessageBox.Show("数据存储成功");
string sqlUpdateFootballMatch = "UPDATE [Table_DateTime] SET [valueResault] ='" + selectDateTime + "数据录入成功',[IsInput] =1 WHERE id=" + idValue + "";
SqlHelper.ExecteNonQuery(CommandType.Text, sqlUpdateFootballMatch);
Thread.Sleep(60000);
}
else
{
string sqlUpdateFootballMatchNull = "UPDATE [Table_DateTime] SET [valueResault] ='" + selectDateTime + "无数据',[IsInput] =1 WHERE id=" + idValue + "";
SqlHelper.ExecteNonQuery(CommandType.Text, sqlUpdateFootballMatchNull);
Thread.Sleep(60000);
//MessageBox.Show("当前时间没有数据");
}
}
else
{
//记录下无数据的时间
//MessageBox.Show("main-tbody不完整");
}
}
两百多行的代码就把足球比赛基础的数据采集回来,这不难,后期的数据细化分类才是重点。
