Загрузите несколько страниц с помощью Htmlagilitypack - C # - PullRequest
0 голосов
/ 22 апреля 2019

Я очистил сайт с помощью HTMLAgilityPack в C #, и я пытаюсь открыть все ссылки внутри него и очистить их тем же методом.Но когда я пытаюсь вызвать этот метод снизу, страница загружается из библиотеки, так как у меня активен AdBlock.На самом деле, я не могу найти ни одной таблицы, и загруженный HTML-код говорит: «Обнаружен ADblock».Это странно, потому что я отфильтровал веб-сайт oddsmath в своем Google Chrome и могу без проблем загрузить главную страницу.Кто-нибудь сталкивался с этой проблемой?

Эта функция и "Console.WriteLine" предназначена только для тестирования и просмотра полного HTML-кода.

   public void GetMatchesDetails()
    {
        List<String> matchDetails = new List<string>();
        foreach (Oddsmath om in oddsmathGoodMatches)
        {
            matchDetails.Add("http://www.oddsmath.com" + om.matchUrl);
        }
        foreach (String om in matchDetails)
        {
            HtmlDocument doc = new HtmlWeb().Load(om);

            foreach (HtmlNode table in doc.DocumentNode.SelectNodes("html"))
            {

                Console.WriteLine("Found: " + table.OuterHtml);
                foreach (HtmlNode row in table.SelectNodes("tr"))
                {
                    Console.WriteLine("row");
                    foreach (HtmlNode cell in row.SelectNodes("th|td"))
                    {
                        Console.WriteLine("cell: " + cell.InnerText);
                    }
                }
            }
        }

    }

РЕДАКТИРОВАТЬ Пройдя немного глубже, язаметил, что, возможно, это не проблема моего приложения или что-то, связанное с Adblock, но, кажется, связано с веб-сайтом, который я пытаюсь очистить ... На самом деле, если вы видите страницу, подобную этой: oddsmath.com/football/international/afc-champions-league-1053 /… вы можете видеть, что содержимое правильно загружено в браузер, но таблицы внутри исходного кода пусты.Зачем?Это Javascript, который мешает загрузке страницы?

1 Ответ

1 голос
/ 23 апреля 2019

Во-первых: используйте все, что вам больше всего нравится с HAP против AngleSharp, если только время не является решающим фактором в вашем приложении.И в этом случае это не так.

Второе: используйте веб-отладчик, такой как Fiddler или Charles, чтобы понять, что вы на самом деле получаете, когда делаете запрос.Поскольку вы на самом деле не получаете HTML, созданный с помощью вызовов JavaScript или API.Вы получаете только исходный код страницы.Вот почему таблицы пусты.Они генерируются с помощью любого javascript.

Например.Я просто использовал веб-отладчик, чтобы увидеть, что сайт делает вызов API:

http://www.oddsmath.com/api/v1/dropping-odds.json/?sport_type=soccer&provider_id=7&cat_id=0&interval=60&sortBy=1&limit=30&language=en

Затем javascript будет использовать этот объект json для создания остальной части страницы.

И это возвращаетхороший объект json, с которым легче ориентироваться, чем с помощью eithr HAP или AngleSharp.Я рекомендую использовать NewtonSoft JSON.

Если вы непреклонны в использовании HtmlAgilityPack, вам нужно объединить его с Selenium.Потому что тогда вы можете подождать, пока страница полностью загрузится, прежде чем разбирать HTML.

[Edit] Дальнейшее копание:

Api-запрос на получение всех лиг и ихидентификаторы:

http://www.oddsmath.com/api/v1/menu-leagues.json/?language=en

Api-запрос только для лиги чемпионов Азии:

http://www.oddsmath.com/api/v1/events-by-league.json/?language=en&country_code=GB&league_id=1053

Другое решение с Selenium с драйвером Firefox.

Даже если я настоятельно рекомендую вамиспользуйте API и NewtonSoft-JSON для своего решения. Я расскажу, как это можно сделать с помощью Selenium.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HtmlAgilityPack;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;
using System.Threading;

namespace SeleniumHap {
    class Program {
        static void Main(string[] args)
        {
            HtmlDocument doc = new HtmlDocument();
            string url = "http://www.oddsmath.com/football/sweden/division-1-1195/2019-04-26/if-sylvia-vs-nykopings-bis-2858046/";
            //string url = "http://www.oddsmath.com/";

            FirefoxOptions options = new FirefoxOptions();
            //options.AddArguments("--headless");
            IWebDriver driver = new FirefoxDriver(options);
            driver.Navigate().GoToUrl(url);
            while (true) {
                doc.LoadHtml(driver.PageSource);
                HtmlNode n = doc.DocumentNode.SelectSingleNode("//table[@id='table-odds-cat-0']//*[self::th or self::td]");
                if (n != null) {
                    n = n.SelectSingleNode(".//div[@class='live-odds-loading']");
                    if (n == null) {
                        break;
                    }
                }
                Thread.Sleep(1000);
            }
            Console.WriteLine("Exited loop. Meaning the page is done loading since we could get a td. A Crude method but it works");

            HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");

            foreach(HtmlNode table in tables) {
                Console.WriteLine(table.GetAttributeValue("id", "No id"));
                HtmlNodeCollection tableContent = table.SelectNodes(".//*[self::th or self::td]");
                foreach(HtmlNode n in tableContent) {
                    Console.WriteLine(n.InnerHtml);
                }
                break;
            }

            Console.ReadKey();
        }
    }
}

Как видите, я использую Firefox в качестве драйвера вместо хрома.При использовании любого из них вам, возможно, придется изменить параметры, в которых вы изменяете переменную 'BrowserExecutableLocation' , чтобы указать, где находится исполняемый файл браузера.Как вы можете видеть, я использую цикл while, чтобы убедиться, что браузер полностью загружает страницу, прежде чем продолжить чтение html.

...