在c中模拟无限滚动以获得页面的完整html

本文关键字:html 模拟 无限 滚动 | 更新日期: 2023-09-27 18:24:58

有很多网站使用这种(imo)烦人的"无限滚动"风格。例如tumblr、twitter、9gag等网站

我最近尝试用HtmlAgilityPack程序化地从这些网站上抓取一些图片。像这样:

HtmlWeb web = new HtmlWeb();  
HtmlDocument doc = web.Load(url);
var primary = doc.DocumentNode.SelectNodes("//img[@class='badge-item-img']");
var picstring = primary.Select(r => r.GetAttributeValue("src", null)).FirstOrDefault();

这很好,但当我试图从某些网站加载HTML时,我注意到我只返回了少量内容(比如前10个"帖子"或"图片",或者其他什么…)这让我怀疑是否有可能在c#中模拟页面的"向下滚动到底部"。

这不仅仅是当我用程序加载html时的情况,当我只是去tumblr这样的网站,检查firebug或只是"查看源代码"时,我预计所有内容都会在那里的某个地方,但很多内容似乎都用javascript隐藏/插入了。只有在屏幕上实际可见的内容才会出现在HTML源中。

所以我的问题是:是否有可能模拟无限向下滚动到一个页面,并用c#加载HTML(最好)

(我知道我可以为tumblr和twitter使用API,但我只是想和HtmlAgilityPack一起使用一些有趣的黑客工具)

在c中模拟无限滚动以获得页面的完整html

除了嵌入web浏览器(通常在无头环境中不起作用)之外,没有办法一次可靠地为所有此类网站做到这一点。

相反,您应该考虑查看网站的JavaScript,以便在用户向下滚动时查看哪些AJAX查询用于获取内容。

或者,在浏览器中使用web调试器(例如Chrome中包含的调试器)。这些调试器通常有一个"网络"窗格,可以用来检查页面执行的AJAX请求。在向下滚动时查看这些请求应该会为您提供足够的信息来编写模拟这些请求的C#代码。

然后,您必须将这些请求的响应解析为特定API提供的任何类型的内容,这些内容可能是JSON或XML,但几乎可以肯定不是HTML。(无论如何,这可能对你更好,因为它将节省你解析出面向显示的HTML,而AJAX API将为你提供更容易使用的数据对象。)

这些站点正在进行异步http请求以加载后续页面内容。由于HTML敏捷性包没有javascript解释器(谢天谢地),您需要自己发出这些请求。大多数网站很可能不会返回html片段,而是返回JSON。为此,您需要使用JSON解析器,而不是HTML敏捷性包。