RankingListJob.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 static List<F_Team> TeamList = new List<F_Team>();
  26. private static List<DataItemDetail> DateItem = new List<DataItemDetail>();
  27. private static List<F_IntegralRanking> RankingList = new List<F_IntegralRanking>();
  28. public RankingListJob()
  29. {
  30. log = new LogHelper();
  31. services = IOC.Resolve<IDTOpenCode>();
  32. }
  33. public void Execute(IJobExecutionContext context)
  34. {
  35. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  36. GetAll();
  37. }
  38. #region 更新数据
  39. /// <summary>
  40. /// 获取所有数据
  41. /// </summary>
  42. public void GetAll()
  43. {
  44. GetSqlString(GetAllEventUrl, "");
  45. }
  46. /// <summary>
  47. /// 更新数据
  48. /// </summary>
  49. /// <param name="Year"></param>
  50. public void Click(string Year = "")
  51. {
  52. if (Year == "")
  53. {
  54. Year = DateTime.Now.Year.ToString();
  55. }
  56. var sql = string.Format(GetNewEventUrl, Year);
  57. GetSqlString(sql, Year);
  58. }
  59. #endregion
  60. /// <summary>
  61. /// 解析数据
  62. /// </summary>
  63. /// <param name="sqlstring"></param>
  64. private void GetSqlString(string sqlstring, string Year)
  65. {
  66. ThreadPool.SetMinThreads(10, 10);
  67. ThreadPool.SetMaxThreads(500, 500);
  68. TeamList = services.GetTeamList();
  69. var ds = SqlHelper.ExecuteDataset(CommandType.Text, sqlstring);
  70. if (ds != null && ds.Tables.Count > 0)
  71. {
  72. //获取某赛事赛季的html ds.Tables[0].Rows.Count
  73. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  74. {
  75. var url = ds.Tables[0].Rows[i]["Remark"].ToString();
  76. var eventId = ds.Tables[0].Rows[i]["EventId"].ToString();
  77. var season = ds.Tables[0].Rows[i]["Season"].ToString();
  78. Task.Run(() =>
  79. {
  80. GetRanking(url, eventId, season);
  81. });
  82. }
  83. int maxWorkerThreads, workerThreads;
  84. int maxportThreads, portThreads;
  85. while (true)
  86. {
  87. /*
  88. GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
  89. 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
  90. 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
  91. */
  92. ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxportThreads);
  93. ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);
  94. Thread.Sleep(1000);
  95. Trace.WriteLine("正在执行任务的线程数" + (maxWorkerThreads - workerThreads));
  96. if (maxWorkerThreads - workerThreads == 0)
  97. {
  98. Console.WriteLine("Thread Finished!");
  99. break;
  100. }
  101. }
  102. try
  103. {
  104. if (Year != "")
  105. {
  106. services.Delete<F_MakeBallList>(" and Season like '" + Year + "%'");
  107. }
  108. services.SqlBulkCopyAdd<F_IntegralRanking>(RankingList);
  109. Trace.WriteLine("F_IntegralRanking更新完毕");
  110. }
  111. catch (Exception ex)
  112. {
  113. throw;
  114. }
  115. }
  116. }
  117. /// <summary>
  118. /// 读取积分榜信息
  119. /// </summary>
  120. /// <param name="url"></param>
  121. public bool GetRanking(string url, string eventId, string season)
  122. {
  123. if (url.Contains("wwaattssuunn"))
  124. {
  125. return false;
  126. }
  127. HtmlDocument doc = CommonHelper.GetHtml(url, new Dictionary<string, string>(), "", "", 90000, 10);
  128. //获取积分榜列表
  129. var TongJiListData = doc.DocumentNode.SelectNodes("//*[@class='tabs1_main_ul']");
  130. if (TongJiListData == null || TongJiListData.Count == 0) return false;
  131. DateItem = services.GetDataItem(DataItemDetailEnum.FootIntegralRankingType);
  132. //总榜
  133. var RankingAll = TongJiListData[0];
  134. Rankinga(RankingAll, eventId, season, FootIntegralRankingEnum.AllRanking);
  135. //主场
  136. var RankingMain = TongJiListData[1];
  137. Rankinga(RankingMain, eventId, season, FootIntegralRankingEnum.MainRanking);
  138. //客场
  139. if (TongJiListData.Count > 2)
  140. {
  141. var RankingPassenger = TongJiListData[2];
  142. Rankinga(RankingPassenger, eventId, season, FootIntegralRankingEnum.PassengerRanking);
  143. }
  144. return true;
  145. }
  146. public void Rankinga(HtmlNode RankingAll, string eventId, string season, FootIntegralRankingEnum rankingEnum)
  147. {
  148. Task.Run(() =>
  149. {
  150. HtmlDocument doc1 = new HtmlDocument();
  151. doc1.LoadHtml(RankingAll.InnerHtml);
  152. var allmatchList = doc1.DocumentNode.SelectNodes("//table/tr");
  153. if (allmatchList == null || allmatchList.Count == 0) return;
  154. foreach (var allmatchItem in allmatchList)
  155. {
  156. try
  157. {
  158. HtmlDocument doc11 = new HtmlDocument();
  159. doc11.LoadHtml(allmatchItem.InnerHtml);
  160. var tdList = doc11.DocumentNode.SelectNodes("//td");
  161. if (tdList == null || tdList.Count == 0)
  162. {
  163. continue;
  164. }
  165. F_IntegralRanking f_IntegralRanking = new F_IntegralRanking();
  166. f_IntegralRanking.Id = Guid.NewGuid().ToString();
  167. f_IntegralRanking.EventId = eventId;
  168. f_IntegralRanking.Season = season;
  169. f_IntegralRanking.IntegralRankingType = DateItem.Where(o => o.ItemValue == ((int)rankingEnum).ToString()).Count() > 0 ? DateItem.Where(o => o.ItemValue == ((int)rankingEnum).ToString()).FirstOrDefault().Id : "";
  170. f_IntegralRanking.Sort = tdList[0].InnerText.Trim() == null ? 0 : int.Parse(tdList[0].InnerText.Trim().ToString());
  171. var TeamName = tdList.Count() > 2 ? tdList[1].InnerText.Trim().ToString() : "";
  172. var Team = TeamList.Where(o => o.Name == TeamName);
  173. f_IntegralRanking.TeamId = Team.Count() > 0 ? Team.FirstOrDefault().Id : TeamName;
  174. f_IntegralRanking.Game = tdList.Count() > 3 ? tdList[2].InnerText.Trim().ToString() : "";
  175. f_IntegralRanking.Win = tdList.Count() > 4 ? int.Parse(tdList[3].InnerText.Trim().ToString()) : 0;
  176. f_IntegralRanking.Flat = tdList.Count() > 5 ? int.Parse(tdList[4].InnerText.Trim().ToString()) : 0;
  177. f_IntegralRanking.Lose = tdList.Count() > 6 ? int.Parse(tdList[5].InnerText.Trim().ToString()) : 0;
  178. f_IntegralRanking.Score = tdList.Count() > 7 ? int.Parse(tdList[6].InnerText.Trim().ToString()) : 0;
  179. f_IntegralRanking.Loss = tdList.Count() > 8 ? int.Parse(tdList[7].InnerText.Trim().ToString()) : 0;
  180. f_IntegralRanking.NetScore = tdList.Count() > 9 ? int.Parse(tdList[8].InnerText.Trim().ToString()) : 0;
  181. f_IntegralRanking.ScoreAvg = tdList.Count() > 10 ? double.Parse(tdList[9].InnerText.Trim().ToString()) : 0;
  182. f_IntegralRanking.LossAvg = tdList.Count() > 11 ? double.Parse(tdList[10].InnerText.Trim().ToString()) : 0;
  183. f_IntegralRanking.WinRate = tdList.Count() > 12 ? double.Parse(tdList[11].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  184. f_IntegralRanking.FlatRate = tdList.Count() > 13 ? double.Parse(tdList[12].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  185. f_IntegralRanking.LoseRate = tdList.Count() > 14 ? double.Parse(tdList[13].InnerText.Trim().Replace("%", "").ToString()) / 100 : 0;
  186. f_IntegralRanking.Integral = tdList.Count() > 15 ? int.Parse(tdList[14].InnerText.Trim().ToString()) : 0;
  187. f_IntegralRanking.CreateDateTime = DateTime.Now;
  188. RankingList.Add(f_IntegralRanking);
  189. }
  190. catch (Exception ex)
  191. {
  192. throw;
  193. }
  194. }
  195. });
  196. }
  197. #region SQL语句
  198. /// <summary>
  199. /// 获取所有的赛事
  200. /// </summary>
  201. private static string GetAllEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null";
  202. /// <summary>
  203. /// 获取最新两年的数据赛事
  204. /// </summary>
  205. private static string GetNewEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null and Season like '%{0}%'";
  206. #endregion
  207. }
  208. }