using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using FCS.Common; using FCS.Crawler.ZCLotteryIP; using FCS.Interface; using FCS.Models; using HtmlAgilityPack; using Quartz; namespace FCS.Crawler.ZCLotteryGames { public class GamesDetailsJob : CommonJob, IJob { private Dictionary detailDict;//比赛类型关系 private List detailType;//比赛类型 private List playersList;//球员信息 private static object locker = new object(); private static List result = new List(); private static string homeTeamName = "zhudui"; public GamesDetailsJob() { //new IPJob().GetIP(); playersList = services.Query().ToList(); detailType = services.GetDataItem(DataItemDetailEnum.FootBallDetailType); // < !--1 : 入球, 2 : 红牌, 3 : 黄牌, 7 : 点球, 8 : 乌龙, 9 : 两黄变红1111111-- > detailDict = new Dictionary { {"1",1 },{"3",5 }, {"2",6 },{"7",2 }, {"8",3 },{"9",6 }, {"11",9 } }; } public void Execute(IJobExecutionContext context) { Config = CommonHelper.GetConfigFromDataMap(context.JobDetail.JobDataMap); Click(); } public void Click(string mainUrl = "http://fenxi.zgzcw.com") { var gamesList = services.Query(@" AND DateName(year,GetDate())=datename(year,StartDateTime) AND DateName(month, GetDate()) = datename(month, StartDateTime) AND DateName(day, GetDate()) = datename(day, StartDateTime)").ToList(); var gamesDetailsList = services.Query(@" AND DateName(year,GetDate())=datename(year,b.StartDateTime) AND DateName(month, GetDate()) = datename(month, b.StartDateTime) AND DateName(day, GetDate()) = datename(day, b.StartDateTime) ", @"JOIN F_Games b ON a.GameId =b.Id") ?? new List(); threadCount = gamesList.Count; gamesList.ForEach(p => { Analysis(p); }); lock (locker) { while (finishcount != threadCount) { Thread.Sleep(5000); Monitor.Wait(locker);//等待 } } var data = new List(); var addList = (from a in result where !(from b in gamesDetailsList orderby b.GameId select b.GameId).Contains(a.GameId) orderby a.GameId select a).ToList(); data = data.Concat(addList).ToList(); addList = (from a in result where !(from b in gamesDetailsList where a.GameId == b.GameId orderby b.GameId select b.Minutes).Contains(a.Minutes) && (from b in gamesDetailsList where a.GameId == b.GameId orderby b.GameId select b.GameId).Contains(a.GameId) orderby a.GameId select a).ToList(); data = data.Concat(addList).ToList(); services.SqlBulkCopyAdd(data); } public void GetALL(string mainUrl = "http://fenxi.zgzcw.com") { var gamesList = services.Query("AND (Season LIKE '{0}%' or Season LIKE '%{1}%')".FormatMe(DateTime.Now.Year, DateTime.Now.AddYears(1).Year)).ToList(); var result = new List(); // var _gamesList = gamesList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); gamesList.ForEach(p => { Analysis(p); }); while (true) { if (CommonHelper.ThreadsFinsh()) break; } services.SqlBulkCopyAdd(result); } private async Task Analysis(F_Games p, string mainUrl = "http://fenxi.zgzcw.com") { await Task.Run(() => { try { var number = p.Remark.Split('/')[p.Remark.Split('/').ToList().Count - 2]; var url = mainUrl + "/" + number + "/zrtj"; Trace.WriteLine("URL:" + url); var doc = CommonHelper.GetHtml(url, "足彩"); var jstj = doc.DocumentNode.SelectSingleNode(".//div[@class='jstj']"); if (jstj != null) { var li = jstj.SelectNodes(".//li"); if (li != null) foreach (HtmlNode item in li) { var liclassList = item.Attributes["data"].Value.Split(',').ToList(); var detail = string.Empty; if (detailDict.ContainsKey(liclassList[1])) detail = detailType.Where(q => q.ItemValue == detailDict[liclassList[1]].ToString()).ToList()[0].Id; else continue; lock (locker) { result.Add(new F_GamesDetails { Id = CommonHelper.GetGuid().ToString(), CreateDateTime = DateTime.Now, GameId = p.Id, Minutes = int.Parse(liclassList[0]), // PlayerId = playerId, DetailType = detail, Describe = liclassList[2], IsHomeTeam = item.ParentNode.Attributes["class"].Value == homeTeamName ? true : false }); } } } } finally { lock (locker) { finishcount++; Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。 } } }); } } }