using System; using FCS.Common; using FCS.Interface; using FCS.Models; using FCS.Models.Entity; using HtmlAgilityPack; using Quartz; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using FCS.Crawler.ZCLotteryMatchs; using System.Configuration; using FCS.Models.DTO; namespace FCS.Crawler.Basketball { /// /// 篮球球员统计 /// public class B_PlayersStatisticsJob : CommonJob { private Dictionary groupDict_NBA;//分组配置 private Dictionary typeDict_NBA; //类型配置 private string groupType_NBA = "_groupType";//用以得分替换字段 private string season_NBA = "_season";//用以得分替换字段 private string eventId;//获取赛事编码 private List groupList;//分组 private List teamList;//球队 private List playerList;//球员 private List result = new List(); public B_PlayersStatisticsJob() { #region 篮球的页面与服务器的数据关联 var zUrl_NBA = "http://lanqiu.zgzcw.com";//主域名 var hUrl_NBA = "?source_league_id=1&season={0}&type={1}".FormatMe(season_NBA, groupType_NBA);//公共域名参数配置 groupDict_NBA = new Dictionary { {"季前赛","1" }, {"常规赛","2" }, {"季后赛","3" }, }; typeDict_NBA = new Dictionary { { "得分",zUrl_NBA+"/1/17-18/{0}/playerStatistics.do".FormatMe(groupType_NBA)}, { "投篮",zUrl_NBA+"/nba/playerShoot.action"+hUrl_NBA}, { "三分",zUrl_NBA+"/nba/playerThreeShoot.action"+hUrl_NBA}, { "罚球",zUrl_NBA+"/nba/playerPenaltyShoot.action"+hUrl_NBA}, { "篮板",zUrl_NBA+"/nba/playerBackboard.action"+hUrl_NBA}, { "助攻",zUrl_NBA+"/nba/playerHelp.action"+hUrl_NBA}, { "盖帽",zUrl_NBA+"/nba/playerCover.action"+hUrl_NBA}, { "抢断",zUrl_NBA+"/nba/playerRob.action"+hUrl_NBA}, { "失误",zUrl_NBA+"/nba/playerMiss.action"+hUrl_NBA}, { "犯规",zUrl_NBA+"/nba/playerFoul.action"+hUrl_NBA}, { "两双",zUrl_NBA+"/nba/playerDouble.action"+hUrl_NBA}, { "三双",zUrl_NBA+"/nba/playerThree.action"+hUrl_NBA} }; #endregion } public void Click() { Click_NBA(); } /// /// 获取所有数据 /// public void GetAll_NBA() { GetSqlData_NBA(); //获取NBA的分组 groupList = services.Query(" AND ParentId IS NULL AND EventId='{0}'".FormatMe(eventId), "", "distinct Id,Season,Name").ToList(); groupList.ForEach(p => { Analysis_NBA(p); }); while (true) { if (CommonHelper.ThreadsFinsh()) break; } services.SqlBulkCopyAdd(result); } /// /// 更新数据 /// /// public void Click_NBA(string Year = "") { GetSqlData_NBA(); //获取NBA的分组 groupList = services.Query( " AND ParentId IS NULL AND EventId='{0}' AND Season LIKE '%{1}%' ".FormatMe(eventId, DateTime.Now.Year.ToString().Substring(2)), "", "distinct Id,Season,Name").ToList(); groupList.ForEach(p => { Analysis_NBA(p); }); Thread.Sleep(3000); Task.WaitAll(taskList.ToArray()); var deleteWhere = ""; groupList.ForEach(p => { deleteWhere += "'" + p.Id + "',"; }); deleteWhere = deleteWhere.ToString().Substring(0, deleteWhere.ToString().Length - 1); services.Delete(" AND GroupingId IN ({0})".FormatMe(deleteWhere)); services.SqlBulkCopyAdd(result); } /// /// 得到数据库相关的数据——NBA /// private void GetSqlData_NBA() { //获取NBA的赛事编码 eventId = new B_EventsJob().GetEventList().Where(p => p.Name == ConfigurationManager.AppSettings["NBAEventName"]).ToList()[0].Id; //获取NBA的球队 teamList = services.Query(" AND EventId='{0}'".FormatMe(eventId), "", "Id,Name").ToList(); //获取NBA的球员 playerList = services.Query(" AND b.EventId='{0}'".FormatMe(eventId), " JOIN B_Team b ON a.TeamId =b.Id", "a.Id,a.ChineseName").ToList(); } private async Task Analysis_NBA(B_Grouping p) { foreach (var item in typeDict_NBA) { taskList.Add(Task.Run(() => { try { var url = item.Value.Replace(groupType_NBA, groupDict_NBA[p.Name]).Replace(season_NBA, p.Season); var doc = CommonHelper.GetHtmlHtmlDocument(new HtmlParameterDTO { Url = url, Title = "排名" }); var trList = doc.DocumentNode.SelectNodes(".//tr"); foreach (var tr in trList) { var td = tr.SelectNodes(".//td"); if (td == null || td.Count <= 0) continue; string playerName = td[1].SelectNodes("./a")[0].InnerText.Trim(); var teamName = td[2].SelectNodes("./a")[0].InnerText.Trim(); result.Add(new B_PlayersStatistics { Id = CommonHelper.GetGuid().ToString(), CreateDateTime = DateTime.Now, EventId = eventId, GroupingId = p.Id, PlayerId = (from a in playerList where a.ChineseName == playerName select a.Id).Take(1).ToJoin(), PlayerName = td[1].SelectNodes("./a")[0].InnerText.Trim(), TeamId = (from a in teamList where a.Name == teamName select a.Id).Take(1).ToJoin(), TeamName = teamName, Season = p.Season, Sort = td[0].SelectNodes("./em")[0].InnerText.Trim().TryToInt32(), Sum = td[3].InnerText.Trim().TryToInt32(), Remark = td[1].SelectNodes("./a")[0].Attributes["href"].Value + "|" + td[2].SelectNodes("./a")[0].Attributes["href"].Value, TotalShooting = td[4].InnerText, HitNumber = td[5].InnerText, TotalScore = item.Key == "得分" ? td[6].InnerText : string.Empty, AvgScore = td.Count >= 8 ? td[7].InnerText : string.Empty, HitRate = td.Count >= 8 ? td[6].InnerText : string.Empty, StatisticTypeName = item.Key }); } } finally { lock (locker) { finishcount++; Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。 } } })); } } } }