有很多网站使用这种(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?
(我知道我可以将 API 用于 tumblr 和 twitter,但我只是想与 HtmlAgilityPack 一起尝试一些有趣的黑客攻击)
最佳答案
没有办法一次性为所有此类网站可靠地执行此操作,除非嵌入网络浏览器(这通常无法在 headless 环境中工作)。
您应该考虑做的是查看网站的 JavaScript,以便了解在用户向下滚动时使用哪些 AJAX 查询来获取内容。
或者,在您的浏览器中使用网络调试器(例如 Chrome 中包含的调试器)。这些调试器通常有一个“网络” Pane ,您可以使用它来检查页面执行的 AJAX 请求。向下滚动时查看这些请求应该会给您足够的信息来编写模拟这些请求的 C# 代码。
然后,您必须将这些请求的响应解析为特定 API 提供的任何类型的内容,这可能是 JSON 或 XML,但几乎可以肯定不是 HTML。 (无论如何,这对您来说可能更好,因为它将使您不必解析面向显示的 HTML,而 AJAX API 将为您提供应该更易于使用的数据对象。)
关于c# - 在 C# 中模拟无限滚动以获取页面的完整 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842379/