Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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));
        }
Пример #6
0
 public abstract bool CanSanitize(AngleSharp.Dom.IElement element);
Пример #7
0
        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);
            }
        }
Пример #8
0
        /// <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();
        }