123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- 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
- {
- /// <summary>
- /// 篮球让球盘路
- /// </summary>
- public class B_MakeBallRankingJob : CommonJob, IJob
- {
- private List<B_MakeBallRanking> MakeBallRankingList = new List<B_MakeBallRanking>();
- private List<B_MakeBallRanking> CBAMakeBallRankingList = new List<B_MakeBallRanking>();
- private List<DataItemDetail> DateItem = new List<DataItemDetail>();
- private List<B_Team> TeamList = new List<B_Team>();
- B_MakeBallRanking g;
- private string cbaEventId = "";
- private string nbaEventId = "";
- public B_MakeBallRankingJob()
- {
- g = new B_MakeBallRanking();
- cbaEventId = services.Query<B_Events>("and Name ='CBA赛事'", "").FirstOrDefault().Id;
- nbaEventId = services.Query<B_Events>("and Name ='NBA赛事'", "").FirstOrDefault().Id;
- }
- public void Execute(IJobExecutionContext context)
- {
- Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap);
- }
- #region NBA
- #region 更新数据
- /// <summary>
- /// 获取所有数据
- /// </summary>
- public void GetAll()
- {
- GetSqlString("");
- }
- /// <summary>
- /// 更新数据
- /// </summary>
- /// <param name="Year"></param>
- public void Click(string Year = "")
- {
- if (Year == "")
- {
- Year = DateTime.Now.Year.ToString().Substring(2, 2); ;
- }
- GetSqlString(Year);
- GetAll_CBA();
- }
- #endregion
- /// <summary>
- /// 解析数据
- /// </summary>
- /// <param name="sqlstring"></param>
- private void GetSqlString(string Year)
- {
- var dataItem = services.GetDataItem(DataItemDetailEnum.FootBallMakeBallType);
- TeamList = services.Query<B_Team>().ToList();
- var ds = services.Query<B_Grouping>(" and EventId='" + nbaEventId + "' and Remark is not null", "", "distinct EventId,Season,Remark").ToList();
- if (Year != "")
- {
- ds = services.Query<B_Grouping>(" 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 eventId = p.EventId;
- var season = p.Season;
- var url = p.Remark.ToString().Replace("saiAll.do", "1/letPlateBall.do");
- GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "1").First().Id.ToString());
- url = p.Remark.ToString().Replace("saiAll.do", "2/letPlateBall.do");
- GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "2").First().Id.ToString());
- url = p.Remark.ToString().Replace("saiAll.do", "3/letPlateBall.do");
- GetData(url, eventId, season, dataItem.Where(o => o.ItemValue == "3").First().Id.ToString());
- });
- lock (g)
- {
- num++;
- Monitor.Pulse(g); //完成,通知等待队列,告知已完,执行下一个。
- }
- });
- lock (g)
- {
- while (num < max)
- {
- Monitor.Wait(g);//等待
- }
- }
- Trace.WriteLine("获取B_MakeBallRanking 完结");
- try
- {
- if (Year != "")
- {
- services.Delete<B_MakeBallRanking>("and EventId='" + nbaEventId + "' and Season like '%" + Year + "%'");
- }
- services.SqlBulkCopyAdd<B_MakeBallRanking>(MakeBallRankingList);
- }
- catch (Exception ex)
- {
- throw;
- }
- }
- /// <summary>
- /// 解析排行榜数据
- /// </summary>
- /// <param name="url"></param>
- /// <param name="eventId"></param>
- /// <param name="season"></param>
- private void GetData(string url, string eventId, string season, string makeBallType)
- {
- 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']").First();
- HtmlDocument itemdoc = new HtmlDocument();
- itemdoc.LoadHtml(team.InnerHtml);
- var trList = itemdoc.DocumentNode.SelectNodes("//table/tr").ToList();
- trList.ForEach(p =>
- {
- if (!p.InnerHtml.Contains("<th"))
- {
- HtmlDocument trdoc = new HtmlDocument();
- trdoc.LoadHtml(p.InnerHtml);
- var tdList = trdoc.DocumentNode.InnerHtml.Contains("td") ? trdoc.DocumentNode.SelectNodes("//td").ToList() : null;
- if (tdList != null && tdList.Count() > 1)
- {
- B_MakeBallRanking making = new B_MakeBallRanking();
- making.Id = Guid.NewGuid().ToString();
- making.Sort = int.Parse(tdList[0].InnerText.Trim().ToString());
- making.MakeBallType = makeBallType;
- making.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 : "";
- making.EventId = eventId;
- making.Season = season;
- making.Sum = int.Parse(tdList[2].InnerText.Trim().ToString());
- making.UpDisc = int.Parse(tdList[3].InnerText.Trim().ToString());
- making.DownDisc = int.Parse(tdList[4].InnerText.Trim().ToString());
- making.WinDiscNum = int.Parse(tdList[5].InnerText.Trim().ToString());
- making.GoDiscNum = int.Parse(tdList[6].InnerText.Trim().ToString());
- making.TransportDiscNum = int.Parse(tdList[7].InnerText.Trim().ToString());
- making.NetDiscNum = int.Parse(tdList[8].InnerText.Trim().ToString());
- making.WinPercentage = tdList[9].InnerText.Trim().ToString();
- making.GoPercentage = tdList[10].InnerText.Trim().ToString();
- making.NegativePercentage = tdList[11].InnerText.Trim().ToString();
- making.Remark = tdList[1].InnerText.Trim().ToString();
- MakeBallRankingList.Add(making);
- }
- }
- });
- }
- #endregion
- #region CBA
- /// <summary>
- /// CBA所有数据
- /// </summary>
- public void GetAll_CBA()
- {
- GetCBAMakeBallRanking();
- services.Delete<B_MakeBallRanking>("and EventId='" + cbaEventId + "'");
- services.SqlBulkCopyAdd<B_MakeBallRanking>(CBAMakeBallRankingList);
- }
- /// <summary>
- /// 解析CBA js数据
- /// </summary>
- private void GetCBAMakeBallRanking()
- {
- int startyear = 5;
- int endtyear = DateTime.Now.AddYears(1).Year % 100;
- List<string> Years = new List<string>();
- //组装时间段
- 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++;
- }
- var dataItem = services.GetDataItem(DataItemDetailEnum.FootBallMakeBallType);
- //获取排行榜
- foreach (var item in Years)
- {
- var url = "http://nba.nowscore.com/jsData/letGoal/" + item + "/l5.js";
- var htmlResource = NetHelper.GetUrlResponse(url, Encoding.GetEncoding("utf-8")).Replace(" ", "");
- if (htmlResource.IsEmpty())
- return;
- var arrs = htmlResource.Split(';');
- var arrTeam = arrs[1].Split('=')[1];
- var TotalPanLu = arrs[2].Split('=')[1];
- var HomePanLu = arrs[3].Split('=')[1];
- var GuestPanLu = arrs[4].Split('=')[1];
- //球队数据
- var arrTeamList = JsonConvert.DeserializeObject<object[][]>(arrTeam).ToList();
- //总榜数据
- var TotalPanLuList = JsonConvert.DeserializeObject<object[][]>(TotalPanLu).ToList();
- //主场数据
- var HomePanLuList = JsonConvert.DeserializeObject<object[][]>(HomePanLu).ToList();
- //客场数据
- var GuestPanLuList = JsonConvert.DeserializeObject<object[][]>(GuestPanLu).ToList();
- #region 总榜
- var makeType = dataItem.Where(o => o.ItemValue == "1").First().Id.ToString();
- for (int i = 0; i < TotalPanLuList.Count(); i++)
- {
- var teamName = arrTeamList.Where(o => o[0].ToString() == TotalPanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == TotalPanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
- var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
- B_MakeBallRanking making = new B_MakeBallRanking();
- making.Id = Guid.NewGuid().ToString();
- making.Sort = int.Parse( TotalPanLuList[i][0].ToString());
- making.MakeBallType = makeType;
- making.TeamId = teamId;
- making.EventId = cbaEventId;
- making.Season = item;
- making.Sum = int.Parse(TotalPanLuList[i][2].ToString());
- making.UpDisc = int.Parse(TotalPanLuList[i][3].ToString());
- making.DownDisc = int.Parse(TotalPanLuList[i][4].ToString());
- making.WinDiscNum = int.Parse(TotalPanLuList[i][5].ToString());
- making.GoDiscNum = int.Parse(TotalPanLuList[i][6].ToString());
- making.TransportDiscNum = int.Parse(TotalPanLuList[i][7].ToString());
- making.NetDiscNum = int.Parse(TotalPanLuList[i][8].ToString());
- making.WinPercentage = TotalPanLuList[i][9].ToString();
- making.GoPercentage = TotalPanLuList[i][10].ToString();
- making.NegativePercentage = TotalPanLuList[i][11].ToString();
- making.Remark = url;
- CBAMakeBallRankingList.Add(making);
- }
- #endregion
- #region 主场
- makeType = dataItem.Where(o => o.ItemValue == "2").First().Id.ToString();
- for (int i = 0; i < HomePanLuList.Count(); i++)
- {
- var teamName = arrTeamList.Where(o => o[0].ToString() == HomePanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == HomePanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
- var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
- B_MakeBallRanking making = new B_MakeBallRanking();
- making.Id = Guid.NewGuid().ToString();
- making.Sort = int.Parse(HomePanLuList[i][0].ToString());
- making.MakeBallType = makeType;
- making.TeamId = teamId;
- making.EventId = cbaEventId;
- making.Season = item;
- making.Sum = int.Parse(HomePanLuList[i][2].ToString());
- making.UpDisc = int.Parse(HomePanLuList[i][3].ToString());
- making.DownDisc = int.Parse(HomePanLuList[i][4].ToString());
- making.WinDiscNum = int.Parse(HomePanLuList[i][5].ToString());
- making.GoDiscNum = int.Parse(HomePanLuList[i][6].ToString());
- making.TransportDiscNum = int.Parse(HomePanLuList[i][7].ToString());
- making.NetDiscNum = int.Parse(HomePanLuList[i][8].ToString());
- making.WinPercentage = HomePanLuList[i][9].ToString();
- making.GoPercentage = HomePanLuList[i][10].ToString();
- making.NegativePercentage = HomePanLuList[i][11].ToString();
- making.Remark = url;
- CBAMakeBallRankingList.Add(making);
- }
- #endregion
- #region 客场
- makeType = dataItem.Where(o => o.ItemValue == "3").First().Id.ToString();
- for (int i = 0; i < GuestPanLuList.Count(); i++)
- {
- var teamName = arrTeamList.Where(o => o[0].ToString() == GuestPanLuList[i][1].ToString()).Count() > 0 ? arrTeamList.Where(o => o[0].ToString() == GuestPanLuList[i][1].ToString()).FirstOrDefault()[1] : "";
- var teamId = services.Query<B_Team>("and Name ='" + teamName + "'", "").Count() > 0 ? services.Query<B_Team>("and Name ='" + teamName + "'", "").FirstOrDefault().Id : "";
- B_MakeBallRanking making = new B_MakeBallRanking();
- making.Id = Guid.NewGuid().ToString();
- making.Sort = int.Parse(GuestPanLuList[i][0].ToString());
- making.MakeBallType = makeType;
- making.TeamId = teamId;
- making.EventId = cbaEventId;
- making.Season = item;
- making.Sum = int.Parse(GuestPanLuList[i][2].ToString());
- making.UpDisc = int.Parse(GuestPanLuList[i][3].ToString());
- making.DownDisc = int.Parse(GuestPanLuList[i][4].ToString());
- making.WinDiscNum = int.Parse(GuestPanLuList[i][5].ToString());
- making.GoDiscNum = int.Parse(GuestPanLuList[i][6].ToString());
- making.TransportDiscNum = int.Parse(GuestPanLuList[i][7].ToString());
- making.NetDiscNum = int.Parse(GuestPanLuList[i][8].ToString());
- making.WinPercentage = GuestPanLuList[i][9].ToString();
- making.GoPercentage = GuestPanLuList[i][10].ToString();
- making.NegativePercentage = GuestPanLuList[i][11].ToString();
- making.Remark = url;
- CBAMakeBallRankingList.Add(making);
- }
- #endregion
- }
- }
- #endregion
- }
- }
|