7

有很多网站使用这种(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 来做一些有趣的黑客活动)

4

2 回答 2

6

没有办法一次性可靠地为所有此类网站执行此操作,除非嵌入 Web 浏览器(通常无法在无头环境中工作)。

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

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

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

于 2013-07-24T18:49:56.353 回答
1

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

于 2013-07-24T18:50:04.630 回答