Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }