使用C#模拟无限滚动以获取完整页面的HTML。

7

有很多网站使用这种(在我看来)令人烦恼的“无限滚动”样式。例如,像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尝试一些有趣的黑客技巧。)
2个回答

6

无法一次性可靠地为所有此类网站做到这一点,除非嵌入一个Web浏览器(通常在无头环境中无法使用)。

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

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

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


1
那些网站正在进行异步Http请求以加载后续页面内容。由于HTML Agility Pack没有javascript解释器(感谢上苍),因此您需要自行进行这些请求。大多数情况下,大多数网站不会返回html片段,而是JSON格式。为此,您需要使用JSON解析器,而不是HTML Agility Pack。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接