B_LeagueRankingJob.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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 Newtonsoft.Json;
  8. using Quartz;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Diagnostics;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. namespace FCS.Crawler.Basketball
  17. {
  18. /// <summary>
  19. /// 篮球联盟排名服务
  20. /// </summary>
  21. public class B_LeagueRankingJob : CommonJob, IJob
  22. {
  23. private List<B_LeagueRanking> LeagueRankingList = new List<B_LeagueRanking>();
  24. private List<B_LeagueRanking> CBALeagueRankingList = new List<B_LeagueRanking>();
  25. private List<DataItemDetail> DateItem = new List<DataItemDetail>();
  26. private List<B_Team> TeamList = new List<B_Team>();
  27. B_LeagueRanking g;
  28. private string cbaEventId = "";
  29. private string nbaEventId = "";
  30. public B_LeagueRankingJob()
  31. {
  32. log = new LogHelper();
  33. services = IOC.Resolve<IDTOpenCode>();
  34. g = new B_LeagueRanking();
  35. cbaEventId = services.Query<B_Events>("and Name ='CBA赛事'", "").FirstOrDefault().Id;
  36. nbaEventId = services.Query<B_Events>("and Name ='NBA赛事'", "").FirstOrDefault().Id;
  37. }
  38. public void Execute(IJobExecutionContext context)
  39. {
  40. Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
  41. }
  42. #region NBA
  43. /// <summary>
  44. /// 获取所有数据 NBA
  45. /// </summary>
  46. public void GetAll()
  47. {
  48. GetSqlString( "");
  49. }
  50. /// <summary>
  51. /// 更新数据NBA
  52. /// </summary>
  53. /// <param name="Year"></param>
  54. public void Click(string Year = "")
  55. {
  56. if (Year == "")
  57. {
  58. Year = DateTime.Now.Year.ToString().Substring(2, 2);
  59. }
  60. GetSqlString( Year);
  61. GetAll_CBA();
  62. }
  63. /// <summary>
  64. /// 解析数据
  65. /// </summary>
  66. /// <param name="sqlstring"></param>
  67. private void GetSqlString(string Year)
  68. {
  69. TeamList = services.Query<B_Team>().ToList();
  70. var ds = services.Query<B_Grouping>("and EventId='"+nbaEventId+"' and Remark is not null", "", "distinct EventId,Season,Remark").ToList();
  71. if (Year != "")
  72. {
  73. ds = services.Query<B_Grouping>(" and EventId='" + nbaEventId + "' and Remark is not null and Season like '%" + Year + "%'", "", "distinct EventId,Season,Remark").ToList();
  74. }
  75. int max = ds.Count;
  76. int num = 0;
  77. ds.ForEach(async p =>
  78. {
  79. await Task.Run(() =>
  80. {
  81. var url = p.Remark.ToString().Replace("saiAll.do", "pai.do");
  82. var eventId = p.EventId;
  83. var season = p.Season;
  84. GetData(url, eventId, season);
  85. });
  86. lock (g)
  87. {
  88. num++;
  89. Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。
  90. }
  91. });
  92. lock (g)
  93. {
  94. while (num < max)
  95. {
  96. Monitor.Wait(g);//等待
  97. }
  98. }
  99. Trace.WriteLine("获取B_LeagueRanking 完结");
  100. try
  101. {
  102. if (Year != "")
  103. {
  104. services.Delete<B_LeagueRanking>("and EventId='" + nbaEventId + "' and Season like '%" + Year + "%'");
  105. }
  106. services.SqlBulkCopyAdd<B_LeagueRanking>(LeagueRankingList);
  107. }
  108. catch (Exception ex)
  109. {
  110. throw;
  111. }
  112. }
  113. /// <summary>
  114. /// 解析排行榜数据
  115. /// </summary>
  116. /// <param name="url"></param>
  117. /// <param name="eventId"></param>
  118. /// <param name="season"></param>
  119. private void GetData(string url, string eventId, string season)
  120. {
  121. HtmlParameterDTO dtomodel = new HtmlParameterDTO();
  122. dtomodel.Url = url;
  123. HtmlDocument doc = CommonHelper.GetHtmlHtmlDocument(dtomodel);
  124. if (doc.DocumentNode.InnerHtml == "Termination" || doc.DocumentNode.InnerHtml == "" || doc.DocumentNode.SelectNodes("//*[@class='paiming']") == null)
  125. {
  126. return;
  127. }
  128. var team = doc.DocumentNode.SelectNodes("//*[@class='paiming']");
  129. foreach (var item in team)
  130. {
  131. HtmlDocument itemdoc = new HtmlDocument();
  132. itemdoc.LoadHtml(item.InnerHtml);
  133. var trList = itemdoc.DocumentNode.SelectNodes("//table/tr").ToList();
  134. var TypeName = "";
  135. if (itemdoc.DocumentNode.InnerText.Contains("东部"))
  136. {
  137. TypeName = "东部排行";
  138. }
  139. else
  140. {
  141. TypeName = "西部排行";
  142. }
  143. trList.ForEach(p =>
  144. {
  145. if (!p.InnerText.Contains("<th"))
  146. {
  147. HtmlDocument trdoc = new HtmlDocument();
  148. trdoc.LoadHtml(p.InnerHtml);
  149. if (doc.DocumentNode.SelectNodes("//td") == null)
  150. return;
  151. var tdList = trdoc.DocumentNode.InnerHtml.Contains("td") ? trdoc.DocumentNode.SelectNodes("//td").ToList() : null;
  152. if (tdList != null && tdList.Count() > 1)
  153. {
  154. B_LeagueRanking ranking = new B_LeagueRanking();
  155. ranking.Id = Guid.NewGuid().ToString();
  156. ranking.Sort = int.Parse(tdList[0].InnerText.ToString());
  157. 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 : "";
  158. ranking.EventId = eventId;
  159. ranking.Season = season;
  160. ranking.Win = int.Parse(tdList[2].InnerText.Trim().ToString());
  161. ranking.Lose = int.Parse(tdList[3].InnerText.Trim().ToString());
  162. ranking.WinRate = tdList[4].InnerText.Trim().ToString();
  163. ranking.WinDivide = tdList[5].InnerText.Trim().ToString();
  164. ranking.ScoreAvg = tdList[6].InnerText.Trim().ToString();
  165. ranking.LossAvg = tdList[7].InnerText.Trim().ToString();
  166. ranking.League = tdList[8].InnerText.Trim().ToString();
  167. ranking.Division = tdList[9].InnerText.Trim().ToString();
  168. ranking.Home = tdList[10].InnerText.Trim().ToString();
  169. ranking.Visiting = tdList[11].InnerText.Trim().ToString();
  170. ranking.NearlyTen = tdList[12].InnerText.Trim().ToString();
  171. ranking.Status = tdList[13].InnerText.Trim().ToString();
  172. ranking.Remark = TypeName;
  173. LeagueRankingList.Add(ranking);
  174. }
  175. }
  176. });
  177. }
  178. }
  179. #endregion
  180. #region CBA
  181. /// <summary>
  182. /// CBA所有数据
  183. /// </summary>
  184. public void GetAll_CBA()
  185. {
  186. GetCBALeagueRanking();
  187. services.Delete<B_LeagueRanking>("and EventId='" + cbaEventId + "'");
  188. services.SqlBulkCopyAdd<B_LeagueRanking>(CBALeagueRankingList);
  189. }
  190. /// <summary>
  191. /// 解析CBA js数据
  192. /// </summary>
  193. private void GetCBALeagueRanking()
  194. {
  195. int startyear = 5;
  196. int endtyear = DateTime.Now.AddYears(1).Year % 100;
  197. List<string> Years = new List<string>();
  198. //组装时间段
  199. while (startyear < endtyear)
  200. {
  201. int temp = startyear + 1;
  202. string Year = (startyear < 10 ? "0" + startyear.ToString() : startyear.ToString()) + "-" + (temp < 10 ? "0" + temp.ToString() : temp.ToString());
  203. Years.Add(Year);
  204. startyear++;
  205. }
  206. //获取排行榜
  207. foreach (var item in Years)
  208. {
  209. var url = "http://nba.nowscore.com/jsData/rank/" + item + "/s5.js";
  210. var htmlResource = NetHelper.GetUrlResponse(url, Encoding.GetEncoding("utf-8")).Replace("&nbsp;", "");
  211. if (htmlResource.IsEmpty())
  212. return;
  213. var arrs = htmlResource.Split(';');
  214. //var arrLeague = arrs[0].Split('=')[1];
  215. var arrTeam = arrs[1].Split('=')[1];
  216. var westData = arrs[2].Split('=')[1];
  217. //var lastUpdateTime = arrs[3].Split('=')[1];
  218. //var scoreColor = arrs[4].Split('=')[1];
  219. var arrTeamList = JsonConvert.DeserializeObject<object[][]>(arrTeam).ToList();
  220. var westDataList = JsonConvert.DeserializeObject<object[][]>(westData).ToList();
  221. for (int i = 0; i < westDataList.Count(); i++)
  222. {
  223. var teamName = arrTeamList.Where(o => o[0].ToString() == westDataList[i][0].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == westDataList[i][0].ToString()).FirstOrDefault()[1] : "";
  224. var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
  225. B_LeagueRanking ranking = new B_LeagueRanking();
  226. ranking.Id = Guid.NewGuid().ToString();
  227. ranking.Sort = i + 1;
  228. ranking.TeamId = teamId;
  229. ranking.EventId = cbaEventId;
  230. ranking.Season = item;
  231. ranking.Win = int.Parse(westDataList[i][1].ToString());
  232. ranking.Lose = int.Parse(westDataList[i][2].ToString());
  233. ranking.WinRate = westDataList[i][3].ToString();
  234. ranking.WinDivide = westDataList[i][5].ToString();
  235. ranking.ScoreAvg = westDataList[i][6].ToString();
  236. ranking.LossAvg = westDataList[i][7].ToString();
  237. //ranking.League = westDataList[i][1].ToString();
  238. //ranking.Division = westDataList[i][1].ToString();
  239. ranking.Home = westDataList[i][12].ToString() + "-" + westDataList[i][13].ToString();
  240. ranking.Visiting = westDataList[i][14].ToString() + "-" + westDataList[i][15].ToString();
  241. ranking.NearlyTen = westDataList[i][16].ToString() + "-" + westDataList[i][17].ToString(); ;
  242. ranking.Status = westDataList[i][18].ToString();
  243. ranking.Remark = url;
  244. CBALeagueRankingList.Add(ranking);
  245. }
  246. }
  247. }
  248. #endregion
  249. }
  250. }