RankingListJob.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections.Generic;
  3. using FCS.Common;
  4. using FCS.Crawler.Tools;
  5. using FCS.Interface;
  6. using FCS.Models;
  7. using HtmlAgilityPack;
  8. using Newtonsoft.Json;
  9. using Quartz;
  10. using System.Data;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using System.Data.SqlClient;
  15. using System.Threading.Tasks;
  16. using System.Threading;
  17. using System.Diagnostics;
  18. namespace FCS.Crawler.ZCMatchRankingList
  19. {
  20. /// <summary>
  21. /// 积分排行榜
  22. /// </summary>
  23. public class RankingListJob : CommonJob, IJob
  24. {
  25. private List<F_Team> TeamList = new List<F_Team>();
  26. private List<DataItemDetail> DateItem = new List<DataItemDetail>();
  27. private List<F_IntegralRanking> RankingList = new List<F_IntegralRanking>();
  28. F_IntegralRanking g;
  29. public RankingListJob()
  30. {
  31. log = new LogHelper();
  32. services = IOC.Resolve<IDTOpenCode>();
  33. g = new F_IntegralRanking();
  34. }
  35. public void Execute(IJobExecutionContext context)
  36. {
  37. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  38. GetAll();
  39. }
  40. #region 更新数据
  41. /// <summary>
  42. /// 获取所有数据
  43. /// </summary>
  44. public void GetAll()
  45. {
  46. GetSqlString(GetAllEventUrl, "");
  47. }
  48. /// <summary>
  49. /// 更新数据
  50. /// </summary>
  51. /// <param name="Year"></param>
  52. public void Click(string Year = "")
  53. {
  54. CommonHelper.LogBD(typeof(RankingListJob), () =>
  55. {
  56. if (Year == "")
  57. {
  58. Year = DateTime.Now.Year.ToString();
  59. }
  60. var sql = string.Format(GetNewEventUrl, Year);
  61. GetSqlString(sql, Year);
  62. });
  63. }
  64. #endregion
  65. /// <summary>
  66. /// 解析数据
  67. /// </summary>
  68. /// <param name="sqlstring"></param>
  69. private void GetSqlString(string sqlstring, string Year)
  70. {
  71. TeamList = services.GetTeamList();
  72. var searchsql = "and Remark is not null ";
  73. if (Year != "")
  74. {
  75. searchsql += "and Season like '%" + Year + "%'";
  76. }
  77. var ds = services.Query<F_Grouping>(searchsql,"", "distinct EventId,Season,Remark").ToList();
  78. if (ds != null && ds.Count > 0)
  79. {
  80. //获取某赛事赛季的html ds.Tables[0].Rows.Count
  81. int max = ds.Count;
  82. int num = 0;
  83. ds.ForEach(async p =>
  84. {
  85. var url = p.Remark.ToString();
  86. var eventId = p.EventId.ToString();
  87. var season = p.Season.ToString();
  88. await Task.Run(() =>
  89. {
  90. if (!url.Contains("cup"))
  91. {
  92. GetRanking(url, eventId, season);
  93. }
  94. });
  95. lock (g)
  96. {
  97. num++;
  98. Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。
  99. }
  100. });
  101. lock (g)
  102. {
  103. while (num < max)
  104. {
  105. Monitor.Wait(g);//等待
  106. }
  107. }
  108. Trace.WriteLine("获取RankingListJob 完结");
  109. try
  110. {
  111. if (Year != "" && services.Query<F_IntegralRanking>().ToList().Count() > 0)
  112. {
  113. services.Delete<F_IntegralRanking>(" and Season like '%" + Year + "%'");
  114. }
  115. services.SqlBulkCopyAdd<F_IntegralRanking>(RankingList);
  116. Trace.WriteLine("F_IntegralRanking更新完毕");
  117. }
  118. catch (Exception ex)
  119. {
  120. throw;
  121. }
  122. }
  123. }
  124. /// <summary>
  125. /// 读取积分榜信息
  126. /// </summary>
  127. /// <param name="url"></param>
  128. public bool GetRanking(string url, string eventId, string season)
  129. {
  130. if (url.Contains("wwaattssuunn"))
  131. {
  132. return false;
  133. }
  134. HtmlDocument doc = CommonHelper.GetHtml(url, new Dictionary<string, string>(), "", "", 10000, 100);
  135. //获取积分榜列表
  136. var TongJiListData = doc.DocumentNode.SelectNodes("//*[@class='tabs1_main_ul']");
  137. if (TongJiListData == null || TongJiListData.Count == 0) return false;
  138. DateItem = services.GetDataItem(DataItemDetailEnum.FootIntegralRankingType);
  139. //总榜
  140. var RankingAll = TongJiListData[0];
  141. Rankinga(RankingAll, eventId, season, FootIntegralRankingEnum.AllRanking);
  142. //主场
  143. if (TongJiListData.Count > 2)
  144. {
  145. var RankingMain = TongJiListData[1];
  146. Rankinga(RankingMain, eventId, season, FootIntegralRankingEnum.MainRanking);
  147. }
  148. //客场
  149. if (TongJiListData.Count > 3)
  150. {
  151. var RankingPassenger = TongJiListData[2];
  152. Rankinga(RankingPassenger, eventId, season, FootIntegralRankingEnum.PassengerRanking);
  153. }
  154. return true;
  155. }
  156. public void Rankinga(HtmlNode RankingAll, string eventId, string season, FootIntegralRankingEnum rankingEnum)
  157. {
  158. Task.Run(() =>
  159. {
  160. HtmlDocument doc1 = new HtmlDocument();
  161. doc1.LoadHtml(RankingAll.InnerHtml);
  162. var allmatchList = doc1.DocumentNode.SelectNodes("//table/tr");
  163. if (allmatchList == null || allmatchList.Count == 0) return;
  164. foreach (var allmatchItem in allmatchList)
  165. {
  166. try
  167. {
  168. HtmlDocument doc11 = new HtmlDocument();
  169. doc11.LoadHtml(allmatchItem.InnerHtml);
  170. var tdList = doc11.DocumentNode.SelectNodes("//td");
  171. if (tdList == null || tdList.Count == 0)
  172. {
  173. continue;
  174. }
  175. F_IntegralRanking f_IntegralRanking = new F_IntegralRanking();
  176. f_IntegralRanking.Id = Guid.NewGuid().ToString();
  177. f_IntegralRanking.EventId = eventId;
  178. f_IntegralRanking.Season = season;
  179. f_IntegralRanking.IntegralRankingType = DateItem.Where(o => o.ItemValue == ((int)rankingEnum).ToString()).Count() > 0 ? DateItem.Where(o => o.ItemValue == ((int)rankingEnum).ToString()).FirstOrDefault().Id : "";
  180. f_IntegralRanking.Sort = tdList.Count() > 1 ? tdList[0].InnerText.Trim() == null ? 0 : int.Parse(tdList[0].InnerText.Trim().ToString()) : 0;
  181. var TeamName = tdList.Count() > 2 ? tdList[1].InnerText.Trim().ToString() : "";
  182. var Team = TeamList.Where(o => o.Name == TeamName);
  183. f_IntegralRanking.TeamId = Team.Count() > 0 ? Team.FirstOrDefault().Id : TeamName;
  184. f_IntegralRanking.Game = tdList.Count() > 3 ? tdList[2].InnerText.Trim().ToString() : "";
  185. f_IntegralRanking.Win = tdList.Count() > 4 ? int.Parse(tdList[3].InnerText.Trim().ToString()) : 0;
  186. f_IntegralRanking.Flat = tdList.Count() > 5 ? int.Parse(tdList[4].InnerText.Trim().ToString()) : 0;
  187. f_IntegralRanking.Lose = tdList.Count() > 6 ? int.Parse(tdList[5].InnerText.Trim().ToString()) : 0;
  188. f_IntegralRanking.Score = tdList.Count() > 7 ? int.Parse(tdList[6].InnerText.Trim().ToString()) : 0;
  189. f_IntegralRanking.Loss = tdList.Count() > 8 ? int.Parse(tdList[7].InnerText.Trim().ToString()) : 0;
  190. f_IntegralRanking.NetScore = tdList.Count() > 9 ? int.Parse(tdList[8].InnerText.Trim().ToString()) : 0;
  191. f_IntegralRanking.ScoreAvg = tdList.Count() > 10 ? double.Parse(tdList[9].InnerText.Trim().ToString()) : 0;
  192. f_IntegralRanking.LossAvg = tdList.Count() > 11 ? double.Parse(tdList[10].InnerText.Trim().ToString()) : 0;
  193. f_IntegralRanking.WinRate = tdList.Count() > 12 ? double.Parse(tdList[11].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  194. f_IntegralRanking.FlatRate = tdList.Count() > 13 ? double.Parse(tdList[12].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  195. f_IntegralRanking.LoseRate = tdList.Count() > 14 ? double.Parse(tdList[13].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  196. f_IntegralRanking.Integral = tdList.Count() > 15 ? int.Parse(tdList[14].InnerText.Trim().ToString()) : 0;
  197. f_IntegralRanking.CreateDateTime = DateTime.Now;
  198. RankingList.Add(f_IntegralRanking);
  199. }
  200. catch (Exception ex)
  201. {
  202. throw;
  203. }
  204. }
  205. });
  206. }
  207. #region SQL语句
  208. /// <summary>
  209. /// 获取所有的赛事
  210. /// </summary>
  211. private static string GetAllEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null";
  212. /// <summary>
  213. /// 获取最新两年的数据赛事
  214. /// </summary>
  215. private static string GetNewEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null and Season like '%{0}%'";
  216. #endregion
  217. }
  218. }