Exemplo n.º 1
0
        private async Task <FoodMaterialItem> GetFoodMaterial(string foodMaterialName, string foodMaterialHref)
        {
            string englishName = CrawlerHelper.GetUrlLast(foodMaterialHref);

            var foodMaterial = new FoodMaterialItem()
            {
                Description = foodMaterialName,
                EnglishName = englishName,
                SourceUrl   = foodMaterialHref,
                Photo       = FoodMaterial.GetImageUrlPath(englishName),
            };

            IHtmlDocument foodMaterialDoc = await CrawlerHelper.GetDocumentAddHttpPrefixAsync(foodMaterialHref + "/useful");

            var sourceImgUrl = foodMaterialDoc.QuerySelector("#category_pic")?.GetAttribute("data-src");

            if (sourceImgUrl == null)
            {
                Logger.Error($"{foodMaterialName} 找不到 category_pic");
            }

            //string localImgPath = "FoodMaterial\\" + englishName + ".jpg";
            if (ChiMaConfig.NeedDownloadFoodMaterialImage && sourceImgUrl != null)
            {
                string localImgPath = FoodMaterial.GetImageLocalPath(englishName);
                CrawlerHelper.DownloadImgAndSaveAsync(sourceImgUrl, localImgPath);
            }

            var nutritionsUL = foodMaterialDoc.QuerySelector(".category_use_table.mt10.clear")?.FirstElementChild;

            foodMaterial.Nutritions = new List <string>();
            if (nutritionsUL != null)
            {
                foreach (var li in nutritionsUL.GetElementsByTagName("li"))
                {
                    var name = li.TextContent;
                    //var value = li.FirstElementChild.TextContent;
                    foodMaterial.Nutritions.Add(name);
                }
            }

            return(foodMaterial);
        }
Exemplo n.º 2
0
        //补充 还不完整的信息
        private async Task FillDetail(DishDetailsRawDataItem detail)
        {
            IHtmlDocument doc = await CrawlerHelper.GetDocumentASync($"https:{detail.Url}");

            //大图
            var img = doc.QuerySelector(".J_photo img"); // 找出大图url

            detail.BigImageUrl = img?.GetAttribute("src");
            // 分类
            var tips = doc.QuerySelectorAll(".recipeTip.mt16");

            if (tips != null && tips.Length >= 3)
            {
                var           links = tips[2].GetElementsByTagName("a");
                StringBuilder sb    = new StringBuilder();
                foreach (var a in links)
                {
                    sb.Append(a.TextContent);
                    sb.Append(",");
                }
                detail.Tags = sb.ToString();
            }
            // 配比bom
            var particulars = doc.QuerySelectorAll(".particulars");

            if (particulars != null && particulars.Length >= 2)
            {
                var boms = particulars.Select(p =>
                {
                    var bom = new DishBomRawData();
                    var bis = p.GetElementsByTagName("li").Select(li =>
                    {
                        var spans = li.Children;
                        if (spans != null && spans.Length >= 2)
                        {
                            var bi = new BomItem()
                            {
                                EnglishName      = CrawlerHelper.GetUrlLast(spans[0].FirstElementChild?.GetAttribute("href")),
                                FoodMaterialName = spans[0].GetElementsByTagName("b").FirstOrDefault()?.TextContent,
                                Use = spans[1].TextContent,
                            };
                            return(bi);
                        }
                        else
                        {
                            return(new BomItem());
                        }
                    }
                                                                  );
                    bom.AddRange(bis);
                    return(bom);
                }).ToList();
                if (boms != null && boms.Count >= 2)
                {
                    detail.DishBom    = boms[0];
                    detail.AuxDishBom = boms[1];
                }
            }

            // 口味等
            var specs = doc.QuerySelectorAll(".recipeCategory_sub_R.mt30.clear li").Select(li =>
            {
                return(li.GetElementsByTagName("a").FirstOrDefault()?.TextContent);
            }).ToList();

            if (specs != null && specs.Count >= 4)
            {
                detail.Taste      = specs[0];
                detail.Technology = specs[1];
                detail.CookTime   = specs[2];
                detail.Difficulty = specs[3];
            }
            // 步骤
            var steps = doc.QuerySelectorAll(".recipeStep li").Select(li =>
            {
                string url     = li.GetElementsByTagName("img").FirstOrDefault()?.GetAttribute("src");
                string content = li.LastElementChild?.TextContent;
                return(new CookeyItem()
                {
                    Photo = url,
                    Content = content
                });
            }).ToList();

            detail.Cookery = new CookeryRawData(steps);
        }