C# 将 Instagram 配置文件下载为 HTML
C# Downloading Instagram Profile As HTML
我一直在尝试下载 public 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
当您使用 Web 请求检索内容时,它 returns 一个 HTML 文档,然后由浏览器呈现以显示内容。
现在,您正在保存服务器给您的 HTML 文档。而不是这样做,你需要在获取细节之前渲染它。一种方法是使用 Web 浏览器控件。如果将 URL 设置为 instragram URL,让渲染引擎处理它,一旦控件触发加载事件,就可以获得渲染的 HTML 输出。
从那里,您可以反序列化为 XmlDocument,并准确确定您需要从呈现的输出中检索哪些详细信息。
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;
}
回答
感谢您提供有关如何下载 HTML 的建议!最后我设法 return 一些 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 内容的方法,那么它可能不一样 :(
我一直在尝试下载 public 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
当您使用 Web 请求检索内容时,它 returns 一个 HTML 文档,然后由浏览器呈现以显示内容。
现在,您正在保存服务器给您的 HTML 文档。而不是这样做,你需要在获取细节之前渲染它。一种方法是使用 Web 浏览器控件。如果将 URL 设置为 instragram URL,让渲染引擎处理它,一旦控件触发加载事件,就可以获得渲染的 HTML 输出。
从那里,您可以反序列化为 XmlDocument,并准确确定您需要从呈现的输出中检索哪些详细信息。
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;
}
回答
感谢您提供有关如何下载 HTML 的建议!最后我设法 return 一些 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 内容的方法,那么它可能不一样 :(