【问题标题】:C# Downloading Instagram Profile As HTMLC# 将 Instagram 个人资料下载为 HTML
【发布时间】:2017-06-15 08:47:23
【问题描述】:

我一直在尝试下载公共 Instagram 个人资料以获取关注者和简历等统计信息。我一直在 c# 控制台应用程序中执行此操作,并使用 HTML Agility Pack 下载 HTML。

代码:

string url = @"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en";
Console.WriteLine();

HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(url);
document.Save(path1);

当我保存它时,我得到的只是一堆脚本和一个空白屏幕:

我想知道在所有脚本运行并形成内容后如何保存 html

【问题讨论】:

    标签: c# html download instagram html-agility-pack


    【解决方案1】:

    当您使用网络请求检索内容时,它会返回一个 HTML 文档,然后由浏览器呈现以显示内容。

    现在,您正在保存服务器提供给您的 HTML 文档。而不是这样做,您需要在获取详细信息之前对其进行渲染。一种方法是使用 Web 浏览器控件。如果将 URL 设置为 instragram URL,则让渲染引擎处理它,一旦控件触发加载事件,您就可以获得渲染的 HTML 输出。

    从那里,您可以反序列化为 XmlDocument,并准确确定您需要从呈现的输出中检索哪些详细信息。

    【讨论】:

    • 我尝试使用 Windows 窗体 WebBrowser,然后使用 Stream Writer 保存文档。然而,这只返回头部和身体标签。我正在 C# 控制台应用程序上开发 webBrowser 对此是否有效?另外我不得不更改线程“因为当前线程不在单线程单元中”
    【解决方案2】:
        public MainWindow()
        {
            InitializeComponent();
            WB_1.Navigate(@"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en");
    
            WB_1.LoadCompleted += wb_LoadCompleted;
        }
    
        void wb_LoadCompleted(object sender, NavigationEventArgs e)
        {
            dynamic doc = WB_1.Document;
            string htmlText = doc.documentElement.InnerHtml;
        }
    

    【讨论】:

    • 你怎么等到它被加载呢?
    • @BenWebb 使用LoadCompleted 事件
    • 我已经让你的代码工作了,但它与我使用 HTML 敏捷包的原始输出没有区别
    【解决方案3】:

    回答

    感谢有关如何下载 HTML 的建议!最后我设法返回了一些 Instagram 信息。代码如下:

    //(This was done using HTML Agility Pack)
    
    string url = @"https://www.instagram.com/" + Console.ReadLine() + @"/?hl=en";
    
    HtmlWeb web = new HtmlWeb();
    HtmlDocument document = web.Load(url);
    
    var metas = document.DocumentNode.Descendants("meta");
    var followers = metas.FirstOrDefault(_ => _.HasProperty("name", "description"));
    
    if (followers == null) { Console.WriteLine("Sorry, Can't Find Profile :("); return; }
    
    var content = followers.Attributes["content"].Value.StopAt('-');
    
    Console.WriteLine(content);
    

    还有 HasProperty() 和 StopAt()

    public static bool HasProperty(this HtmlNode node, string property, params string[] valueArray)
    {
        var propertyValue = node.GetAttributeValue(property, "");
        var propertyValues = propertyValue.Split(' ');
        return valueArray.All(c => propertyValues.Contains(c));
    }
    
    public static string StopAt(this string input, char stopAt)
    {
        int x = input.IndexOf(stopAt);
        return input.Substring(0, x);
    }
    

    注意:

    但是,这仍然不是我正在寻找的答案。我仍然有一个 HTML 残骸,它的结构与我在 Google Chrome 中查看它时收到的 HTML 不同。在 HTML 中进行一些搜索后,我设法为包含内容的元标记挖掘了无内容的 html。这没关系,但如果我要继续这种查找 HTML 内容的方法,那么它可能会不一样:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多