public void EachSchool(AngleSharp.Dom.IElement school) { School singleSchool = new School(); var element = school.QuerySelectorAll("td[class='class_list_cell']"); var eleLength = element.Length; string tmpUrl = element[0].QuerySelector("a").GetAttribute("href"); //sprintf的な活用法 singleSchool.url = $"https://www.meikogijuku.jp{tmpUrl}"; singleSchool.name = element[0].TextContent; singleSchool.address = element[1].TextContent; string tmpTel = element[2].QuerySelector("a").GetAttribute("href"); singleSchool.tel = tmpTel.Replace("tel:", ""); string tmpStation = element[3].TextContent; singleSchool.station = tmpStation.Replace("最寄駅", ""); this.schoolList.Add(singleSchool); }
/// <summary> /// 图片评论的图片 /// </summary> /// <param name="Comment_Image_DOM"></param> /// <returns></returns> private string CommentImageHandle(AngleSharp.Dom.IElement Comment_Image_DOM) { var image_src = Comment_Image_DOM.QuerySelectorAll("img").FirstOrDefault().GetAttribute("src"); if (!string.IsNullOrEmpty(image_src)) { //替换地址为原图地址 image_src = image_src.Replace(@"/thumb180/", @"/bmiddle/"); } return(image_src); }
private List <AngleSharp.Dom.IElement> getAllElements(AngleSharp.Dom.IElement element) { List <AngleSharp.Dom.IElement> elements = new List <AngleSharp.Dom.IElement>(); elements.Add(element); foreach (var child in element.Children) { elements.AddRange(getAllElements(child)); } return(elements); }
IHtmlElement Convent(AngleSharp.Dom.IElement element) { if (element == null) { return(null); } var ele = new HtmlElement() { Attributes = element.Attributes.ToDictionary(t => t.Name, t => t.Value), ClassName = element.ClassName, ID = element.Id, InnerHtml = element.InnerHtml, OuterHtml = element.OuterHtml, InnerText = element.TextContent, TagName = element.TagName, }; return(ele); }
/// <summary> /// 处理下一页链接 /// </summary> /// <returns></returns> private async Task <string> NextLinkHandle(AngleSharp.Dom.IElement dom) { string link = ""; //这里可能会有多种分页形式,需要不同情况不同判断 //1.加载更多 var divs_dom = dom.QuerySelectorAll("*"); if (divs_dom.Any()) { foreach (var x in divs_dom) { if ("comment_loading".Equals(x.GetAttribute("node-type")) || "click_more_comment".Equals(x.GetAttribute("action-type")) || "click_more_child_comment_big".Equals(x.GetAttribute("action-type"))) { link = x.GetAttribute("action-data"); break; } } } return(await Task.FromResult(link)); }
public abstract bool CanSanitize(AngleSharp.Dom.IElement element);
static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Usage: grab <url>"); return; } try { _sleep = ConfigurationUtility.GetInt32("sleep", 3000); Console.WriteLine($"Sleep={_sleep}ms"); _scale = ConfigurationUtility.GetInt32("scale", 4); Console.WriteLine($"Scale={_scale}x"); _pageUrl = Url.Create(args[0]); _pdfFileName = Path.ChangeExtension ( Path.GetFileNameWithoutExtension(_pageUrl.Path), ".pdf" ); _browsingConfiguration = Configuration.Default.WithDefaultLoader(); _browsingContext = BrowsingContext.New(_browsingConfiguration); IDocument document = _browsingContext.OpenAsync(_pageUrl).Result; Console.WriteLine("HTML downloaded"); string selector = "script"; IHtmlCollection <IElement> scripts = document.QuerySelectorAll(selector); Console.WriteLine($"Scripts: {scripts.Length}"); IElement scriptElement = scripts.First ( e => e.InnerHtml.StartsWith("jQuery.extend") ); string json = scriptElement.InnerHtml; int offset = json.IndexOf('{'); int length = json.LastIndexOf('}') - offset + 1; json = json.Substring(offset, length); JObject root = JObject.Parse(json); JValue token = (JValue)root.SelectToken("$.diva.1.options.objectData"); if (ReferenceEquals(token, null)) { Console.WriteLine("Not a book"); return; } string dataUrl = (string)token.Value; Console.WriteLine($"Data URL={dataUrl}"); token = (JValue)root.SelectToken("$.diva.1.options.iipServerURL"); if (ReferenceEquals(token, null)) { Console.WriteLine("No ServerUrl"); return; } _serverUrl = (string)token.Value; Console.WriteLine($"Server URL={_serverUrl}"); token = (JValue)root.SelectToken("$.diva.1.options.imageDir"); if (ReferenceEquals(token, null)) { Console.WriteLine("No imageDir"); return; } _imageDir = (string)token.Value; Console.WriteLine($"Image dir={_imageDir}"); _webClient = new WebClient(); json = _webClient.DownloadString(dataUrl); root = JObject.Parse(json); JArray array = (JArray)root.SelectToken("pgs"); _pages = array.ToObject <Page[]>(); Console.WriteLine($"Total pages={_pages.Length}"); int pageNumber = 1; foreach (Page page in _pages) { if (DownloadPage(pageNumber, page)) { Thread.Sleep(_sleep); } pageNumber++; } BuildDocument(); } catch (Exception exception) { Console.WriteLine(exception); } }
/// <summary> /// Парсит регион сайта CraigsList /// </summary> /// <param name="regionLink">Полный адрес сайта региона для выборки</param> public void StartParsing(string regionLink, int minPrice, int maxPrice) { string searchPageInline = Constants.WebAttrsNames.NotFound; for (int i = 0; i < 3; i++) { searchPageInline = WebHelpers.GetHtmlThrowProxy(CompileLink(regionLink, Resources.HouseSearchLinkPostfix, minPrice, maxPrice), currentProxy); //парсим обычным образом if (searchPageInline == Constants.WebAttrsNames.NotFound) //, а если не получится, пробуем по другому постфиксу(для некоторых регионов { searchPageInline = WebHelpers.GetHtmlThrowProxy(CompileLink(regionLink, Resources.AltHouseSearchLinkPostfix, minPrice, maxPrice), currentProxy); if (searchPageInline != Constants.WebAttrsNames.NotFound) { break; } } else { break; } UpdateInternalProxy(); } var searchPageDOM = parser.Parse(searchPageInline); //получаем стартовую страницу выдачи нужных предложений. //проверяем, равно ли число общей выдачи для нашей ссылки 2500(максимальный) var totalcountElement = searchPageDOM.QuerySelector(".totalcount"); if (totalcountElement != null) //если не отсутствует(это если результатов нет вообще), тогда проверим на 2500 { if (totalcountElement.TextContent == "2500") { if (maxPrice == Constants.PriceValues.undefinedValue || maxPrice == Constants.PriceValues.undefinedValue) { maxPrice = 1000000; minPrice = 0; } if (maxPrice != minPrice) { int Average = (maxPrice + minPrice) / 2; StartParsing(regionLink, minPrice, Average); StartParsing(regionLink, Average + 1, maxPrice); return; } } } AngleSharp.Dom.IElement searchResultNextPageLink = null; try { searchResultNextPageLink = searchPageDOM.QuerySelector("a.button.next"); } catch (Exception e) { Console.WriteLine(e.Message); } //парсим результаты на текущей странице if (searchResultNextPageLink != null) { string oldSearchResultNextPageLinkstring = "="; do { Console.WriteLine("Начинаем парсить страницу выдачи: {0}{1}", regionLink, searchResultNextPageLink.GetAttribute(Constants.WebAttrsNames.href)); ParseOffersListPage(searchPageDOM, regionLink); //парсим предложения этой страницы Console.WriteLine("Спарсили текущую страницу выдачи!"); var offersListPageHtmlDocument = parser.Parse(WebHelpers.GetHtmlThrowProxy(regionLink + searchResultNextPageLink.GetAttribute(Constants.WebAttrsNames.href), currentProxy)); //получаем DOM-документ одной страницы выдачи предложений searchResultNextPageLink = offersListPageHtmlDocument.QuerySelector("a.button.next"); //берем элемент со ссылкой на следующую страницу if (searchResultNextPageLink == null) { break; } else { if (WrongLink(searchResultNextPageLink, oldSearchResultNextPageLinkstring)) //проверяем, а не ушли ли мы в цикл { break; //если мы в цикле, тогда хватит парсить ту же страницу до бесконечности } else { oldSearchResultNextPageLinkstring = searchResultNextPageLink.GetAttribute(Constants.WebAttrsNames.href); //новая ссылка для будущих итераций } } Console.WriteLine(searchResultNextPageLink != null ? "Получено:" + regionLink + searchResultNextPageLink.GetAttribute(Constants.WebAttrsNames.href) : "На этой странице нет результатов и ссылок на следующую страницу!"); if (searchResultNextPageLink != null) { searchPageDOM = parser.Parse(WebHelpers.GetHtmlThrowProxy(regionLink + searchResultNextPageLink.GetAttribute(Constants.WebAttrsNames.href), currentProxy)); } Console.WriteLine("------------------------------------------"); } while (searchResultNextPageLink != null); } else { Console.WriteLine("Nothing to parse"); UpdateInternalProxy(); //File.AppendAllText("log.txt", String.Format("Регион не спарсился или там нет предложений жилья: {0}, {1}\n", regionLink, DateTime.Now)); //если не спарсилось, заносим в лог string UnsecureRegionLink = regionLink.Replace("https", "http"); if (regionLink.Length != UnsecureRegionLink.Length) { StartParsing(UnsecureRegionLink, minPrice, maxPrice); } } Console.WriteLine("Регион " + regionLink + "обработан!"); //File.AppendAllText("log.txt", String.Format("Регион обработан: {0}, {1}\n", regionLink, DateTime.Now)); //Console.ReadKey(); }