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); }
//补充 还不完整的信息 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); }