/// <summary> /// 内容 /// </summary> /// <param name="title"></param> /// <param name="catalog"></param> /// <returns></returns> public async Task <NomicContent> NomicContent(string title, string catalog) { var redis = _redisCore._redisDB; var catalogKey = $"Catalog_{title}"; var catalogKeyBack = $"Catalog_{title}_back"; var nomicCatalogs = redis.GetCache <List <NomicCatalog> >(catalogKey); NomicContent nomicContent = new NomicContent(); if (nomicCatalogs != null) { nomicCatalogs.ForEach(a => { a.Title = a.Title.Trim(); }); var nomicCatalog = nomicCatalogs.Where(a => a.Title == catalog).FirstOrDefault(); if (nomicCatalog != null) { var key = $"content_{title}_{nomicCatalog.Title}"; nomicContent = redis.GetCache <NomicContent>(key); if (nomicContent == null) { nomicContent = new NomicContent(); var client = httpClientFactory.CreateClient(); var userAgent = configuration.GetSection("User_Agents").Get <string[]>(); Random random = new Random(); client.DefaultRequestHeaders.Add("User-Agent", userAgent[random.Next(0, userAgent.Length - 1)]); var response = await client.GetAsync(nomicCatalog.Url); var str = await response.Content.ReadAsStringAsync(); nomicContent.Title = nomicCatalog.Title; nomicContent.ImgUrls = await HandleNomicContent(str); nomicContent.PreviousPage = nomicCatalogs.Where(a => a.Index == (nomicCatalog.Index - 1)).Select(b => b.Title).FirstOrDefault(); nomicContent.NextPage = nomicCatalogs.Where(a => a.Index == (nomicCatalog.Index + 1)).Select(b => b.Title).FirstOrDefault();; nomicContent.CatalogUrl = title; redis.SetCache(key, nomicContent, TimeSpan.MaxValue); } Task task = new Task(() => { if (nomicContent.ImgUrls.Any(a => a.Contains("http"))) { nomicContent.ImgUrls.ForEach(async a => { a = await DownLoad(a); }); redis.SetCache(key, nomicContent, TimeSpan.MaxValue); } }); task.Start(); } } return(nomicContent); }
/// <summary> /// 解析目录 /// </summary> /// <param name="html"></param> /// <returns></returns> public NomicContent HandleNomicContent(string html) { NomicContent nomicContent = new NomicContent(); List <string> list = new List <string>(); HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(html); var htmlNodes = htmlDocument.DocumentNode.SelectNodes("//article[@class='article-content']//p"); nomicContent.Title = htmlNodes[0].InnerText; var imgNodes = htmlNodes[1].SelectNodes($"{htmlNodes[1].XPath}//img"); foreach (var imgNode in imgNodes) { var img = imgNode.GetAttributeValue("src", ""); list.Add(img); } nomicContent.ImgUrls = list; return(nomicContent); }