代码之家  ›  专栏  ›  技术社区  ›  joei

从URL加载html的两种方法?

  •  0
  • joei  · 技术社区  · 6 年前

    用于从 URL ,我使用以下方法

    public HtmlDocument DownloadSource(string url)
    {
        try
        {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(DownloadString(url));
            return doc;
        }
        catch (Exception e)
        {
            if (Task.Error == null)
                Task.Error = e;
            Task.Status = TaskStatuses.Error;
            Done = true;
            return null;
        }
    }
    

    但是今天突然上面的代码停止工作了。我发现了另一种方法,而且工作正常。

    HtmlWeb web = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc = web.Load(url.ToString());
    

    现在我只想知道两种方法的区别

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andrey Kotov    6 年前

    现在看来 User-Agent 标题是必需的 your site .

    HtmlAgilityPack 但你应该改变 DownloadString(url) 方法。如果您使用 Fiddler ,您将看到它返回 403 Forbidden :

    enter image description here

    解决方案是添加任何 用户代理 请求的标题:

    using HtmlAgilityPack;
    using System;
    using System.Net;
    
    class Program
    {
        static void Main()
        {
            var doc = DownloadSource("https://videohive.net/item/inspired-slideshow/21544630");
            Console.ReadKey();
        }
    
        public static HtmlDocument DownloadSource(string url)
        {
            try
            {
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(DownloadString(url));
                return doc;
            }
            catch (Exception e)
            {
                // exception handling here
            }
            return null;
        }
    
        static String DownloadString(String url)
        {
            WebClient client = new WebClient();
            client.Headers.Add("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x");
            return client.DownloadString(url);
        }
    }