using FCS.Common; using FCS.Interface; using FCS.Models; using FCS.Models.DTO; using FCS.Models.Entity; using HtmlAgilityPack; using Newtonsoft.Json; using Quartz; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FCS.Crawler.Basketball { /// /// 篮球联盟排名服务 /// public class B_LeagueRankingJob : CommonJob, IJob { private List LeagueRankingList = new List(); private List CBALeagueRankingList = new List(); private List DateItem = new List(); private List TeamList = new List(); B_LeagueRanking g; private string cbaEventId = ""; private string nbaEventId = ""; public B_LeagueRankingJob() { log = new LogHelper(); services = IOC.Resolve(); g = new B_LeagueRanking(); cbaEventId = services.Query("and Name ='CBA赛事'", "").FirstOrDefault().Id; nbaEventId = services.Query("and Name ='NBA赛事'", "").FirstOrDefault().Id; } public void Execute(IJobExecutionContext context) { Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap); } #region NBA /// /// 获取所有数据 NBA /// public void GetAll() { GetSqlString( ""); } /// /// 更新数据NBA /// /// public void Click(string Year = "") { if (Year == "") { Year = DateTime.Now.Year.ToString().Substring(2, 2); } GetSqlString( Year); GetAll_CBA(); } /// /// 解析数据 /// /// private void GetSqlString(string Year) { TeamList = services.Query().ToList(); var ds = services.Query("and EventId='"+nbaEventId+"' and Remark is not null", "", "distinct EventId,Season,Remark").ToList(); if (Year != "") { ds = services.Query(" and EventId='" + nbaEventId + "' and Remark is not null and Season like '%" + Year + "%'", "", "distinct EventId,Season,Remark").ToList(); } int max = ds.Count; int num = 0; ds.ForEach(async p => { await Task.Run(() => { var url = p.Remark.ToString().Replace("saiAll.do", "pai.do"); var eventId = p.EventId; var season = p.Season; GetData(url, eventId, season); }); lock (g) { num++; Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。 } }); lock (g) { while (num < max) { Monitor.Wait(g);//等待 } } Trace.WriteLine("获取B_LeagueRanking 完结"); try { if (Year != "") { services.Delete("and EventId='" + nbaEventId + "' and Season like '%" + Year + "%'"); } services.SqlBulkCopyAdd(LeagueRankingList); } catch (Exception ex) { throw; } } /// /// 解析排行榜数据 /// /// /// /// private void GetData(string url, string eventId, string season) { HtmlParameterDTO dtomodel = new HtmlParameterDTO(); dtomodel.Url = url; HtmlDocument doc = CommonHelper.GetHtmlHtmlDocument(dtomodel); if (doc.DocumentNode.InnerHtml == "Termination" || doc.DocumentNode.InnerHtml == "" || doc.DocumentNode.SelectNodes("//*[@class='paiming']") == null) { return; } var team = doc.DocumentNode.SelectNodes("//*[@class='paiming']"); foreach (var item in team) { HtmlDocument itemdoc = new HtmlDocument(); itemdoc.LoadHtml(item.InnerHtml); var trList = itemdoc.DocumentNode.SelectNodes("//table/tr").ToList(); var TypeName = ""; if (itemdoc.DocumentNode.InnerText.Contains("东部")) { TypeName = "东部排行"; } else { TypeName = "西部排行"; } trList.ForEach(p => { if (!p.InnerText.Contains(" 1) { B_LeagueRanking ranking = new B_LeagueRanking(); ranking.Id = Guid.NewGuid().ToString(); ranking.Sort = int.Parse(tdList[0].InnerText.ToString()); 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 : ""; ranking.EventId = eventId; ranking.Season = season; ranking.Win = int.Parse(tdList[2].InnerText.Trim().ToString()); ranking.Lose = int.Parse(tdList[3].InnerText.Trim().ToString()); ranking.WinRate = tdList[4].InnerText.Trim().ToString(); ranking.WinDivide = tdList[5].InnerText.Trim().ToString(); ranking.ScoreAvg = tdList[6].InnerText.Trim().ToString(); ranking.LossAvg = tdList[7].InnerText.Trim().ToString(); ranking.League = tdList[8].InnerText.Trim().ToString(); ranking.Division = tdList[9].InnerText.Trim().ToString(); ranking.Home = tdList[10].InnerText.Trim().ToString(); ranking.Visiting = tdList[11].InnerText.Trim().ToString(); ranking.NearlyTen = tdList[12].InnerText.Trim().ToString(); ranking.Status = tdList[13].InnerText.Trim().ToString(); ranking.Remark = TypeName; LeagueRankingList.Add(ranking); } } }); } } #endregion #region CBA /// /// CBA所有数据 /// public void GetAll_CBA() { GetCBALeagueRanking(); services.Delete("and EventId='" + cbaEventId + "'"); services.SqlBulkCopyAdd(CBALeagueRankingList); } /// /// 解析CBA js数据 /// private void GetCBALeagueRanking() { int startyear = 5; int endtyear = DateTime.Now.AddYears(1).Year % 100; List Years = new List(); //组装时间段 while (startyear < endtyear) { int temp = startyear + 1; string Year = (startyear < 10 ? "0" + startyear.ToString() : startyear.ToString()) + "-" + (temp < 10 ? "0" + temp.ToString() : temp.ToString()); Years.Add(Year); startyear++; } //获取排行榜 foreach (var item in Years) { var url = "http://nba.nowscore.com/jsData/rank/" + item + "/s5.js"; var htmlResource = NetHelper.GetUrlResponse(url, Encoding.GetEncoding("utf-8")).Replace(" ", ""); if (htmlResource.IsEmpty()) return; var arrs = htmlResource.Split(';'); //var arrLeague = arrs[0].Split('=')[1]; var arrTeam = arrs[1].Split('=')[1]; var westData = arrs[2].Split('=')[1]; //var lastUpdateTime = arrs[3].Split('=')[1]; //var scoreColor = arrs[4].Split('=')[1]; var arrTeamList = JsonConvert.DeserializeObject(arrTeam).ToList(); var westDataList = JsonConvert.DeserializeObject(westData).ToList(); for (int i = 0; i < westDataList.Count(); i++) { 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] : ""; var teamId = services.Query("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query("and Name ='" + teamName + "'", "").FirstOrDefault().Id : ""; B_LeagueRanking ranking = new B_LeagueRanking(); ranking.Id = Guid.NewGuid().ToString(); ranking.Sort = i + 1; ranking.TeamId = teamId; ranking.EventId = cbaEventId; ranking.Season = item; ranking.Win = int.Parse(westDataList[i][1].ToString()); ranking.Lose = int.Parse(westDataList[i][2].ToString()); ranking.WinRate = westDataList[i][3].ToString(); ranking.WinDivide = westDataList[i][5].ToString(); ranking.ScoreAvg = westDataList[i][6].ToString(); ranking.LossAvg = westDataList[i][7].ToString(); //ranking.League = westDataList[i][1].ToString(); //ranking.Division = westDataList[i][1].ToString(); ranking.Home = westDataList[i][12].ToString() + "-" + westDataList[i][13].ToString(); ranking.Visiting = westDataList[i][14].ToString() + "-" + westDataList[i][15].ToString(); ranking.NearlyTen = westDataList[i][16].ToString() + "-" + westDataList[i][17].ToString(); ; ranking.Status = westDataList[i][18].ToString(); ranking.Remark = url; CBALeagueRankingList.Add(ranking); } } } #endregion } }