ShooterListJob.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. using System;
  2. using System.Collections.Generic;
  3. using FCS.Common;
  4. using FCS.Interface;
  5. using FCS.Models;
  6. using HtmlAgilityPack;
  7. using Quartz;
  8. using System.Data;
  9. using System.Linq;
  10. using System.Threading.Tasks;
  11. using System.Threading;
  12. using System.Diagnostics;
  13. namespace FCS.Crawler.ZCMatchRankingList
  14. {
  15. /// <summary>
  16. /// 射手榜排行
  17. /// </summary>
  18. public class ShooterListJob : CommonJob, IJob
  19. {
  20. private static List<F_ShooterList> ShooterLists = new List<F_ShooterList>();
  21. private static List<F_Team> TeamList = new List<F_Team>();
  22. private static List<F_Players> PlayerList = new List<F_Players>();
  23. private static List<F_Area> ContryList = new List<F_Area>();
  24. private static List<DataItemDetail> DateItem = new List<DataItemDetail>();
  25. public ShooterListJob()
  26. {
  27. log = new LogHelper();
  28. services = IOC.Resolve<IDTOpenCode>();
  29. }
  30. public void Execute(IJobExecutionContext context)
  31. {
  32. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  33. GetAll();
  34. }
  35. #region 更新数据
  36. /// <summary>
  37. /// 获取所有数据
  38. /// </summary>
  39. public void GetAll()
  40. {
  41. GetSqlString(GetAllEventUrl, "");
  42. }
  43. /// <summary>
  44. /// 更新数据
  45. /// </summary>
  46. /// <param name="Year"></param>
  47. public void Click(string Year = "")
  48. {
  49. if (Year == "")
  50. {
  51. Year = DateTime.Now.Year.ToString();
  52. }
  53. var sql = string.Format(GetNewEventUrl, Year);
  54. GetSqlString(sql, Year);
  55. }
  56. #endregion
  57. /// <summary>
  58. /// 解析数据
  59. /// </summary>
  60. /// <param name="sqlstring"></param>
  61. private void GetSqlString(string sqlstring, string Year)
  62. {
  63. ThreadPool.SetMinThreads(10, 10);
  64. ThreadPool.SetMaxThreads(500, 500);
  65. TeamList = services.GetTeamList();
  66. PlayerList = services.GetPlayerList();
  67. ContryList = services.GetContryList();
  68. var ds = SqlHelper.ExecuteDataset(CommandType.Text, sqlstring);
  69. if (ds != null && ds.Tables.Count > 0)
  70. {
  71. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  72. {
  73. //拿去赛事组的链接
  74. var url = ds.Tables[0].Rows[i]["Remark"].ToString();
  75. var eventId = ds.Tables[0].Rows[i]["EventId"].ToString();
  76. var season = ds.Tables[0].Rows[i]["Season"].ToString();
  77. ////获取到总进球单双的链接
  78. Task.Run(() =>
  79. {
  80. HtmlDocument doc = CommonHelper.GetHtml(url, new Dictionary<string, string>(), "", "", 90000, 10);
  81. var TJList = doc.DocumentNode.SelectNodes("//*[@class='tongji_list']");
  82. if (TJList != null && TJList.Count() != 0 && TJList[0].InnerText.Contains("赛事统计"))
  83. {
  84. HtmlDocument doc1 = new HtmlDocument();
  85. doc1.LoadHtml(TJList[0].InnerHtml);
  86. var liList = doc1.DocumentNode.SelectNodes("//ul/li/a").ToList();
  87. var Glod = liList.Where(o => o.InnerText.Contains("射手榜")).First();
  88. if (Glod != null)
  89. {
  90. var shooturl = Glod.Attributes.SingleOrDefault(a => a.Name.Equals("href")).Value.ToString();
  91. Task.Run(() =>
  92. {
  93. GetList(shooturl, eventId, season);
  94. });
  95. }
  96. }
  97. });
  98. }
  99. int maxWorkerThreads, workerThreads;
  100. int maxportThreads, portThreads;
  101. while (true)
  102. {
  103. /*
  104. GetAvailableThreads():检索由 GetMaxThreads 返回的线程池线程的最大数目和当前活动数目之间的差值。
  105. 而GetMaxThreads 检索可以同时处于活动状态的线程池请求的数目。
  106. 通过最大数目减可用数目就可以得到当前活动线程的数目,如果为零,那就说明没有活动线程,说明所有线程运行完毕。
  107. */
  108. ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxportThreads);
  109. ThreadPool.GetAvailableThreads(out workerThreads, out portThreads);
  110. Thread.Sleep(1000);
  111. Trace.WriteLine("正在执行任务的线程数" + (maxWorkerThreads - workerThreads));
  112. if (maxWorkerThreads - workerThreads == 0)
  113. {
  114. Console.WriteLine("Thread Finished!");
  115. break;
  116. }
  117. }
  118. try
  119. {
  120. if (Year != "")
  121. {
  122. services.Delete<F_ShooterList>(" and Season like '" + Year + "%'");
  123. }
  124. services.SqlBulkCopyAdd<F_ShooterList>(ShooterLists);
  125. Trace.WriteLine("F_ShooterList更新完毕");
  126. }
  127. catch (Exception ex)
  128. {
  129. throw;
  130. }
  131. }
  132. }
  133. /// <summary>
  134. /// 解析射手榜信息
  135. /// </summary>
  136. /// <param name="url"></param>
  137. /// <param name="eventId"></param>
  138. /// <param name="season"></param>
  139. public void GetList(string url, string eventId, string season)
  140. {
  141. if (url.Contains("wwaattssuunn"))
  142. {
  143. return;
  144. }
  145. HtmlDocument doc = CommonHelper.GetHtml(url, new Dictionary<string, string>(), "", "", 90000, 10);
  146. var TongJiListData = doc.DocumentNode.SelectNodes("//*[@class='zstab']");
  147. if (TongJiListData == null || TongJiListData.Count() == 0) return;
  148. DateItem = services.GetDataItem(DataItemDetailEnum.ShooterType);
  149. //总榜
  150. var RankingAll = TongJiListData[0];
  151. ShooterList(RankingAll, eventId, season, ShooterEnum.AllShooter);
  152. //主场
  153. var RankingMain = TongJiListData[1];
  154. ShooterList(RankingMain, eventId, season, ShooterEnum.MainShooter);
  155. //客场
  156. if (TongJiListData.Count > 2)
  157. {
  158. var RankingPassenger = TongJiListData[2];
  159. ShooterList(RankingPassenger, eventId, season, ShooterEnum.PassengerShooter);
  160. }
  161. }
  162. public void ShooterList(HtmlNode ShooterAll, string eventId, string season, ShooterEnum shooterEnum)
  163. {
  164. HtmlDocument doc1 = new HtmlDocument();
  165. doc1.LoadHtml(ShooterAll.InnerHtml);
  166. var allshooterList = doc1.DocumentNode.SelectNodes("//tbody/tr");
  167. if (allshooterList == null || allshooterList.Count == 0) return;
  168. //读取射手榜信息并加入到数据库
  169. foreach (var tritem in allshooterList)
  170. {
  171. try
  172. {
  173. HtmlDocument doc11 = new HtmlDocument();
  174. doc11.LoadHtml(tritem.InnerHtml);
  175. var tdList = doc11.DocumentNode.SelectNodes("//td");
  176. if (tdList == null || tdList.Count == 0) continue;
  177. F_ShooterList f_ShooterList = new F_ShooterList();
  178. f_ShooterList.Id = Guid.NewGuid().ToString();
  179. f_ShooterList.EventId = eventId;
  180. f_ShooterList.Season = season;
  181. f_ShooterList.ShooterType = DateItem.Where(o => o.ItemValue == ((int)shooterEnum).ToString()).Count() > 0 ? DateItem.Where(o => o.ItemValue == ((int)shooterEnum).ToString()).FirstOrDefault().Id : "";
  182. f_ShooterList.Sort = tdList[0].InnerText.Trim() == null || tdList[0].InnerText.Trim() == "" ? 0 : int.Parse(tdList[0].InnerText.Trim().ToString());
  183. var TeamName = tdList[1].InnerText.Trim().ToString();
  184. var Team = TeamList.Where(o => o.Name == TeamName);
  185. f_ShooterList.TeamId = Team.Count() > 0 ? Team.FirstOrDefault().Id : "";
  186. if (Team.Count() == 0)
  187. {
  188. f_ShooterList.Remark = TeamName;
  189. }
  190. f_ShooterList.PlayerName = tdList.Count() > 3 ? tdList[2].InnerText.Trim().ToString() : "";
  191. var Player = PlayerList.Where(o => f_ShooterList.PlayerName != "" && o.ChineseName.Contains(f_ShooterList.PlayerName));
  192. f_ShooterList.PlayerId = Player.Count() > 0 ? Player.FirstOrDefault().Id : "";
  193. f_ShooterList.ContryName = tdList.Count() > 4 ? tdList[3].InnerText.Trim().ToString() : "";
  194. var Contry = ContryList.Where(o => f_ShooterList.ContryName != "" && o.Name == f_ShooterList.ContryName);
  195. f_ShooterList.ContryId = Contry.Count() > 0 ? Contry.FirstOrDefault().Id : "";
  196. f_ShooterList.Sum = tdList.Count() > 5 ? tdList[4].InnerText.Trim() == null || tdList[4].InnerText.Trim() == "" ? 0 : int.Parse(tdList[4].InnerText.Trim().ToString()) : 0;
  197. f_ShooterList.PenaltyKick = tdList.Count() > 6 ? tdList[5].InnerText.Trim() == null || tdList[5].InnerText.Trim() == "" ? 0 : int.Parse(tdList[5].InnerText.Trim().ToString()) : 0;
  198. f_ShooterList.HomeGoal = tdList.Count() > 7 ? tdList[6].InnerText.Trim() == null || tdList[6].InnerText.Trim() == "" ? 0 : int.Parse(tdList[6].InnerText.Trim().ToString()) : 0;
  199. f_ShooterList.PassengerGoal = tdList.Count() > 8 ? tdList[7].InnerText.Trim() == null || tdList[7].InnerText.Trim() == "" ? 0 : int.Parse(tdList[7].InnerText.Trim().ToString()) : 0;
  200. ShooterLists.Add(f_ShooterList);
  201. }
  202. catch (Exception ex)
  203. {
  204. throw;
  205. }
  206. }
  207. }
  208. #region SQL语句
  209. /// <summary>
  210. /// 获取所有的赛事
  211. /// </summary>
  212. private static string GetAllEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null";
  213. /// <summary>
  214. /// 获取最新两年的数据赛事
  215. /// </summary>
  216. private static string GetNewEventUrl = @"select distinct EventId,Season,Remark from F_Grouping where Remark is not null and Season like '%{0}%'";
  217. #endregion
  218. }
  219. }