HtmlAgilityPack полная загрузка страницы - PullRequest
0 голосов
/ 11 апреля 2020

Итак, у меня есть код, который загружает картинки из разобранных ссылок. Загрузка / синтаксический анализ работает хорошо, но у меня проблема с загрузкой полного содержимого этой страницы.

/*
 * https://shikimori.org/animes/38256-magia-record-mahou-shoujo-madoka-magica-gaiden-tv
 * For testing
 */

class Program
{
    static string root = @"C:\Shikimori\";
    static List<string> sources = new List<string>();

    [STAThread]
    static void Main(string[] args)
    {
        Console.Write("Enter link: ");
        var link = Console.ReadLine(); // enter there link from above
        link += "/art";

        var web = new HtmlWeb();
        web.BrowserTimeout = TimeSpan.FromTicks(0);

        var htmlDocument = new HtmlDocument();

        Thread.Sleep(3000);

        try
        {
            htmlDocument = web.LoadFromBrowser(link); //ones per, like, 30m loading almost all page with whole pictures
        }
        catch
        {
            Console.WriteLine("an error has occured.");
        }

        Thread.Sleep(3000);

        var name = htmlDocument.DocumentNode.Descendants("div")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("b-options-floated mobile-phone_portrait r-edit")).ToList();

        //var divlink = htmlDocument.DocumentNode.Descendants("div")
        //    .Where(node => node.GetAttributeValue("class", "")
        //    .Equals("container packery")).ToList();

        var alink = htmlDocument.DocumentNode.Descendants("a")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("b-image")).ToList();

        foreach(var a in alink)
        {
            sources.Add(a.GetAttributeValue("href", string.Empty));
        }

        var tmp = Regex.Replace(name[0].GetDirectInnerText(), "[^a-zA-Z0-9._]", string.Empty);

        root += (tmp+"\\");

        if (!Directory.Exists(root))
        {
            Directory.CreateDirectory(root);
        }

        for (int i = 0; i < sources.Count; i++)
        {
            using (WebClient client = new WebClient())
            {
                var test = sources[i].Split(';').Last().Replace("url=", string.Empty);
                try
                {
                    client.DownloadFile(new Uri(test), root + test.Split('/').Last().Replace("&amp", string.Empty).Replace("?", string.Empty));
                    Console.WriteLine($"Image #{i + 1} download successfully!");
                }
                catch
                {
                    Console.WriteLine($"Image #{i + 1} download unsuccessfully...");
                }
            }
        }

        Thread.Sleep(3000);

        Console.WriteLine("Done!");
        Console.ReadKey();

    }
}

Проблема заключается в следующем: он работает, вероятно, раз в 30 минут, я полагаю? И работать не так хорошо, как я ожидал. Html Parser не загружает контент полностью. Если ссылка содержит более 100 изображений, то в хорошем состоянии я получаю от 5 до 15. Если ссылка (например: https://shikimori.one/animes/1577-taiho-shichau-zo) содержит около 30 изображений, вероятно, она может проанализировать все. (другие варианты не тестировались. Также пытался разобрать картинки гугл, его загрузка происходит как одна страница ссылки, но не доходит до кнопки «Дополнительные результаты»)

Я предполагаю, что сайт защищен от ботов, и поэтому он не всегда отвечает на запросы из моей программы или что-то в этом роде. У этого парня , насколько я понимаю, та же проблема, но ответа до сих пор нет. Как это можно исправить?

...