B_PlayersStatisticsJob.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using System;
  2. using FCS.Common;
  3. using FCS.Interface;
  4. using FCS.Models;
  5. using FCS.Models.Entity;
  6. using HtmlAgilityPack;
  7. using Quartz;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. using FCS.Crawler.ZCLotteryMatchs;
  16. using System.Configuration;
  17. using FCS.Models.DTO;
  18. namespace FCS.Crawler.Basketball
  19. {
  20. /// <summary>
  21. /// 篮球球员统计
  22. /// </summary>
  23. public class B_PlayersStatisticsJob : CommonJob
  24. {
  25. private Dictionary<string, string> groupDict_NBA;//分组配置
  26. private Dictionary<string, string> typeDict_NBA; //类型配置
  27. private string groupType_NBA = "_groupType";//用以得分替换字段
  28. private string season_NBA = "_season";//用以得分替换字段
  29. private string eventId;//获取赛事编码
  30. private List<B_Grouping> groupList;//分组
  31. private List<B_Team> teamList;//球队
  32. private List<B_Players> playerList;//球员
  33. private List<B_PlayersStatistics> result = new List<B_PlayersStatistics>();
  34. public B_PlayersStatisticsJob()
  35. {
  36. #region 篮球的页面与服务器的数据关联
  37. var zUrl_NBA = "http://lanqiu.zgzcw.com";//主域名
  38. var hUrl_NBA = "?source_league_id=1&season={0}&type={1}".FormatMe(season_NBA, groupType_NBA);//公共域名参数配置
  39. groupDict_NBA = new Dictionary<string, string>
  40. {
  41. {"季前赛","1" }, {"常规赛","2" }, {"季后赛","3" },
  42. };
  43. typeDict_NBA = new Dictionary<string, string>
  44. {
  45. { "得分",zUrl_NBA+"/1/17-18/{0}/playerStatistics.do".FormatMe(groupType_NBA)},
  46. { "投篮",zUrl_NBA+"/nba/playerShoot.action"+hUrl_NBA},
  47. { "三分",zUrl_NBA+"/nba/playerThreeShoot.action"+hUrl_NBA},
  48. { "罚球",zUrl_NBA+"/nba/playerPenaltyShoot.action"+hUrl_NBA},
  49. { "篮板",zUrl_NBA+"/nba/playerBackboard.action"+hUrl_NBA},
  50. { "助攻",zUrl_NBA+"/nba/playerHelp.action"+hUrl_NBA},
  51. { "盖帽",zUrl_NBA+"/nba/playerCover.action"+hUrl_NBA},
  52. { "抢断",zUrl_NBA+"/nba/playerRob.action"+hUrl_NBA},
  53. { "失误",zUrl_NBA+"/nba/playerMiss.action"+hUrl_NBA},
  54. { "犯规",zUrl_NBA+"/nba/playerFoul.action"+hUrl_NBA},
  55. { "两双",zUrl_NBA+"/nba/playerDouble.action"+hUrl_NBA},
  56. { "三双",zUrl_NBA+"/nba/playerThree.action"+hUrl_NBA}
  57. };
  58. #endregion
  59. }
  60. public void Click()
  61. {
  62. Click_NBA();
  63. }
  64. /// <summary>
  65. /// 获取所有数据
  66. /// </summary>
  67. public void GetAll_NBA()
  68. {
  69. GetSqlData_NBA();
  70. //获取NBA的分组
  71. groupList = services.Query<B_Grouping>(" AND ParentId IS NULL AND EventId='{0}'".FormatMe(eventId), "", "distinct Id,Season,Name").ToList();
  72. groupList.ForEach(p =>
  73. {
  74. Analysis_NBA(p);
  75. });
  76. while (true)
  77. {
  78. if (CommonHelper.ThreadsFinsh())
  79. break;
  80. }
  81. services.SqlBulkCopyAdd(result);
  82. }
  83. /// <summary>
  84. /// 更新数据
  85. /// </summary>
  86. /// <param name="Year"></param>
  87. public void Click_NBA(string Year = "")
  88. {
  89. GetSqlData_NBA();
  90. //获取NBA的分组
  91. groupList = services.Query<B_Grouping>(
  92. " AND ParentId IS NULL AND EventId='{0}' AND Season LIKE '%{1}%' ".FormatMe(eventId, DateTime.Now.Year.ToString().Substring(2)), "", "distinct Id,Season,Name").ToList();
  93. groupList.ForEach(p =>
  94. {
  95. Analysis_NBA(p);
  96. });
  97. Thread.Sleep(3000);
  98. Task.WaitAll(taskList.ToArray());
  99. var deleteWhere = "";
  100. groupList.ForEach(p =>
  101. {
  102. deleteWhere += "'" + p.Id + "',";
  103. });
  104. deleteWhere = deleteWhere.ToString().Substring(0, deleteWhere.ToString().Length - 1);
  105. services.Delete<B_PlayersStatistics>(" AND GroupingId IN ({0})".FormatMe(deleteWhere));
  106. services.SqlBulkCopyAdd(result);
  107. }
  108. /// <summary>
  109. /// 得到数据库相关的数据——NBA
  110. /// </summary>
  111. private void GetSqlData_NBA()
  112. {
  113. //获取NBA的赛事编码
  114. eventId = new B_EventsJob().GetEventList().Where(p => p.Name == ConfigurationManager.AppSettings["NBAEventName"]).ToList()[0].Id;
  115. //获取NBA的球队
  116. teamList = services.Query<B_Team>(" AND EventId='{0}'".FormatMe(eventId), "", "Id,Name").ToList();
  117. //获取NBA的球员
  118. playerList = services.Query<B_Players>(" AND b.EventId='{0}'".FormatMe(eventId), " JOIN B_Team b ON a.TeamId =b.Id", "a.Id,a.ChineseName").ToList();
  119. }
  120. private async Task Analysis_NBA(B_Grouping p)
  121. {
  122. foreach (var item in typeDict_NBA)
  123. {
  124. taskList.Add(Task.Run(() =>
  125. {
  126. try
  127. {
  128. var url = item.Value.Replace(groupType_NBA, groupDict_NBA[p.Name]).Replace(season_NBA, p.Season);
  129. var doc = CommonHelper.GetHtmlHtmlDocument(new HtmlParameterDTO { Url = url, Title = "排名" });
  130. var trList = doc.DocumentNode.SelectNodes(".//tr");
  131. foreach (var tr in trList)
  132. {
  133. var td = tr.SelectNodes(".//td");
  134. if (td == null || td.Count <= 0)
  135. continue;
  136. string playerName = td[1].SelectNodes("./a")[0].InnerText.Trim();
  137. var teamName = td[2].SelectNodes("./a")[0].InnerText.Trim();
  138. result.Add(new B_PlayersStatistics
  139. {
  140. Id = CommonHelper.GetGuid().ToString(),
  141. CreateDateTime = DateTime.Now,
  142. EventId = eventId,
  143. GroupingId = p.Id,
  144. PlayerId = (from a in playerList
  145. where a.ChineseName == playerName
  146. select a.Id).Take(1).ToJoin(),
  147. PlayerName = td[1].SelectNodes("./a")[0].InnerText.Trim(),
  148. TeamId = (from a in teamList
  149. where a.Name == teamName
  150. select a.Id).Take(1).ToJoin(),
  151. TeamName = teamName,
  152. Season = p.Season,
  153. Sort = td[0].SelectNodes("./em")[0].InnerText.Trim().TryToInt32(),
  154. Sum = td[3].InnerText.Trim().TryToInt32(),
  155. Remark = td[1].SelectNodes("./a")[0].Attributes["href"].Value + "|" + td[2].SelectNodes("./a")[0].Attributes["href"].Value,
  156. TotalShooting = td[4].InnerText,
  157. HitNumber = td[5].InnerText,
  158. TotalScore = item.Key == "得分" ? td[6].InnerText : string.Empty,
  159. AvgScore = td.Count >= 8 ? td[7].InnerText : string.Empty,
  160. HitRate = td.Count >= 8 ? td[6].InnerText : string.Empty,
  161. StatisticTypeName = item.Key
  162. });
  163. }
  164. }
  165. finally
  166. {
  167. lock (locker)
  168. {
  169. finishcount++;
  170. Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
  171. }
  172. }
  173. }));
  174. }
  175. }
  176. }
  177. }