HtmlAgilityPack 整页加载

HtmlAgilityPack full page loading

提问人:Okashi 提问时间:4/12/2020 最后编辑:Oguz OzgulOkashi 更新时间:4/12/2020 访问量:545

问:

因此,我有从解析链接下载图片的代码。下载/解析效果很好,但我在加载此页面的完整内容时遇到了问题。

/*
 * 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 解析器未完全加载内容。如果链接有 100+ 张图片,状况良好,我会从 5 到 15 张。如果链接(例如:https://shikimori.one/animes/1577-taiho-shichau-zo)有大约 30 张图片,它可能会解析所有图片。(其他选项未测试。还尝试解析谷歌图片,它的加载就像一页的链接,没有到达“更多结果”按钮)

我假设该站点受到机器人保护,因此它并不总是响应来自我的程序或类似内容的请求。据我所知,这家伙也有同样的问题,但仍然没有答案。 如何解决这个问题?

C# HTML html-agility-pack url 解析

评论

0赞 Oguz Ozgul 4/12/2020
Thread.Sleep(3000) 表示该线程的执行将延迟 3 秒。(粗略地说..)这不是 30 分钟。此源代码首先下载网页的 html 内容,然后找到 <a class=“b-image”,然后尝试下载所有图像。由于代码没有报告任何异常细节,只是打印出“不成功”,因此我们没有事故的根本原因。更改为并让我们知道完整消息catch(Exception downloadError) { Console.WriteLine(downloadError); }
0赞 Okashi 4/12/2020
@oguz-ozgul,让我再解释一下。在我编译此代码时一直存在问题。但是,正如我所说,它每~30m完全加载页面一个,在我再次运行它后,我还没有完全加载页面。您可以自己检查 htmlDocument 包含的内容。如果我等待 ~30m,它再次作为第一次运行工作。它总是加载一些html源代码,但并不总是完全加载。(启动程序之间有 ~30m 的延迟)
0赞 Oguz Ozgul 4/12/2020
然后正如你所说,该网站对他们的终端有某种限制。我能提出的最好的建议是为您的 Web 客户端设置一个好的用户代理字符串(例如从 Chrome 浏览器请求此站点时的用户代理字符串),以传递任何检查用户代理标头有效性的限制。
0赞 Okashi 4/12/2020
我不是很擅长这个。如何在代码中设置用户代理?
0赞 Oguz Ozgul 4/12/2020
stackoverflow.com/questions/11841540/......这里的答案解释了如何。你可以使用这样的东西。Mozilla/5.0 (Windows NT 10.0;Win64的;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36

答: 暂无答案