B_LeagueRankingJob.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using FCS.Common;
  2. using FCS.Interface;
  3. using FCS.Models;
  4. using FCS.Models.DTO;
  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. namespace FCS.Crawler.Basketball
  16. {
  17. /// <summary>
  18. /// 篮球联盟排名服务
  19. /// </summary>
  20. public class B_LeagueRankingJob : CommonJob, IJob
  21. {
  22. private List<B_LeagueRanking> LeagueRankingList = new List<B_LeagueRanking>();
  23. private List<DataItemDetail> DateItem = new List<DataItemDetail>();
  24. private List<B_Team> TeamList = new List<B_Team>();
  25. B_LeagueRanking g;
  26. public B_LeagueRankingJob()
  27. {
  28. log = new LogHelper();
  29. services = IOC.Resolve<IDTOpenCode>();
  30. g = new B_LeagueRanking();
  31. }
  32. public void Execute(IJobExecutionContext context)
  33. {
  34. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  35. }
  36. #region 更新数据
  37. /// <summary>
  38. /// 获取所有数据
  39. /// </summary>
  40. public void GetAll()
  41. {
  42. GetSqlString(GetAllEventUrl, "");
  43. }
  44. /// <summary>
  45. /// 更新数据
  46. /// </summary>
  47. /// <param name="Year"></param>
  48. public void Click(string Year = "")
  49. {
  50. if (Year == "")
  51. {
  52. Year = DateTime.Now.Year.ToString().Substring(2, 2);
  53. }
  54. var sql = string.Format(GetNewEventUrl, Year);
  55. GetSqlString(sql, Year);
  56. }
  57. #endregion
  58. /// <summary>
  59. /// 解析数据
  60. /// </summary>
  61. /// <param name="sqlstring"></param>
  62. private void GetSqlString(string sqlstring, string Year)
  63. {
  64. TeamList = services.Query<B_Team>().ToList();
  65. var ds = services.Query<B_Grouping>("and Remark is not null", "", "distinct EventId,Season,Remark").ToList();
  66. if (Year != "")
  67. {
  68. ds = services.Query<B_Grouping>("and Remark is not null and Season like '%" + Year + "%'", "", "distinct EventId,Season,Remark").ToList();
  69. }
  70. int max = ds.Count;
  71. int num = 0;
  72. ds.ForEach(async p =>
  73. {
  74. await Task.Run(() =>
  75. {
  76. var url = p.Remark.ToString().Replace("saiAll.do", "pai.do");
  77. var eventId = p.EventId;
  78. var season = p.Season;
  79. GetData(url, eventId, season);
  80. });
  81. lock (g)
  82. {
  83. num++;
  84. Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。
  85. }
  86. });
  87. lock (g)
  88. {
  89. while (num < max)
  90. {
  91. Monitor.Wait(g);//等待
  92. }
  93. }
  94. Trace.WriteLine("获取B_LeagueRanking 完结");
  95. try
  96. {
  97. if (Year != "")
  98. {
  99. services.Delete<B_LeagueRanking>(" and Season like '%" + Year + "%'");
  100. }
  101. services.SqlBulkCopyAdd<B_LeagueRanking>(LeagueRankingList);
  102. }
  103. catch (Exception ex)
  104. {
  105. throw;
  106. }
  107. }
  108. /// <summary>
  109. /// 解析排行榜数据
  110. /// </summary>
  111. /// <param name="url"></param>
  112. /// <param name="eventId"></param>
  113. /// <param name="season"></param>
  114. private void GetData(string url, string eventId, string season)
  115. {
  116. HtmlParameterDTO dtomodel = new HtmlParameterDTO();
  117. dtomodel.Url = url;
  118. HtmlDocument doc = CommonHelper.GetHtmlHtmlDocument(dtomodel);
  119. if (doc.DocumentNode.InnerHtml == "Termination" || doc.DocumentNode.InnerHtml == "" || doc.DocumentNode.SelectNodes("//*[@class='paiming']") == null)
  120. {
  121. return;
  122. }
  123. var team = doc.DocumentNode.SelectNodes("//*[@class='paiming']");
  124. foreach (var item in team)
  125. {
  126. HtmlDocument itemdoc = new HtmlDocument();
  127. itemdoc.LoadHtml(item.InnerHtml);
  128. var trList = itemdoc.DocumentNode.SelectNodes("//table/tr").ToList();
  129. var TypeName = "";
  130. if (itemdoc.DocumentNode.InnerText.Contains("东部"))
  131. {
  132. TypeName = "东部排行";
  133. }
  134. else
  135. {
  136. TypeName = "西部排行";
  137. }
  138. trList.ForEach(p =>
  139. {
  140. if (!p.InnerText.Contains("<th"))
  141. {
  142. HtmlDocument trdoc = new HtmlDocument();
  143. trdoc.LoadHtml(p.InnerHtml);
  144. if (doc.DocumentNode.SelectNodes("//td") == null)
  145. return;
  146. var tdList = trdoc.DocumentNode.InnerHtml.Contains("td") ? trdoc.DocumentNode.SelectNodes("//td").ToList() : null;
  147. if (tdList != null && tdList.Count() > 1)
  148. {
  149. B_LeagueRanking ranking = new B_LeagueRanking();
  150. ranking.Id = Guid.NewGuid().ToString();
  151. ranking.Sort = int.Parse(tdList[0].InnerText.ToString());
  152. ranking.TeamId = TeamList.Where(o => o.Name == tdList[1].InnerText.Trim().ToString()).Count() > 0 ? TeamList.Where(o => o.Name == tdList[1].InnerText.Trim().ToString()).FirstOrDefault().Id : "";
  153. ranking.EventId = eventId;
  154. ranking.Season = season;
  155. ranking.Win = int.Parse(tdList[2].InnerText.Trim().ToString());
  156. ranking.Lose = int.Parse(tdList[3].InnerText.Trim().ToString());
  157. ranking.WinRate = tdList[4].InnerText.Trim().ToString();
  158. ranking.WinDivide = tdList[5].InnerText.Trim().ToString();
  159. ranking.ScoreAvg = tdList[6].InnerText.Trim().ToString();
  160. ranking.LossAvg = tdList[7].InnerText.Trim().ToString();
  161. ranking.League = tdList[8].InnerText.Trim().ToString();
  162. ranking.Division = tdList[9].InnerText.Trim().ToString();
  163. ranking.Home = tdList[10].InnerText.Trim().ToString();
  164. ranking.Visiting = tdList[11].InnerText.Trim().ToString();
  165. ranking.NearlyTen = tdList[12].InnerText.Trim().ToString();
  166. ranking.Status = tdList[13].InnerText.Trim().ToString();
  167. ranking.Remark = TypeName;
  168. LeagueRankingList.Add(ranking);
  169. }
  170. }
  171. });
  172. }
  173. }
  174. #region SQL语句
  175. /// <summary>
  176. /// 获取所有的赛事
  177. /// </summary>
  178. private static string GetAllEventUrl = @"select distinct EventId,Season,Remark from B_Grouping where Remark is not null";
  179. /// <summary>
  180. /// 获取最新两年的数据赛事
  181. /// </summary>
  182. private static string GetNewEventUrl = @"select distinct EventId,Season,Remark from B_Grouping where Remark is not null and Season like '%{0}%'";
  183. #endregion
  184. }
  185. }