使用C#动态获取由JavaScript在HTML文档中生成的数据

11

如何使用C#爬取包含JavaScript动态生成数据的HTML文档?

在C#库中使用WebRequestHttpWebResponse,我能够将整个HTML源代码作为字符串获取,但困难在于我想要的数据并不包含在源代码中,而是由JavaScript动态生成。

另一方面,如果我想要的数据已经包含在源代码中,那么我可以轻松地使用正则表达式获取它们。

我已经下载了HtmlAgilityPack,但我不知道它是否能处理由JavaScript动态生成的项目...

非常感谢!


你需要通过某种JavaScript引擎来运行它。也许可以使用像Awesomium这样的工具? - Mike Christensen
看这里:https://dev59.com/auo6XIcBkEYKwwoYLhXh - sagibb
2个回答

12
当您发起 WebRequest 请求时,您正在请求服务器提供页面文件,但该文件的内容尚未被 Web 浏览器解析/执行,因此其中的 JavaScript 尚未执行任何操作。
如果您想查看浏览器解析后的页面,请使用工具来执行页面上的 JavaScript。一个选项是使用内置的 .net web 浏览器控件:http://msdn.microsoft.com/en-au/library/aa752040(v=vs.85).aspx Web 浏览器控件可以导航到并加载页面,然后您可以查询它的 DOM,该 DOM 将已经被页面上的 JavaScript 更改。
编辑(示例):
Uri uri = new Uri("http://www.somewebsite.com/somepage.htm");

webBrowserControl.AllowNavigation = true;
// optional but I use this because it stops javascript errors breaking your scraper
webBrowserControl.ScriptErrorsSuppressed = true;
// you want to start scraping after the document is finished loading so do it in the function you pass to this handler
webBrowserControl.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserControl_DocumentCompleted);
webBrowserControl.Navigate(uri);

private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElementCollection divs = webBrowserControl.Document.GetElementsByTagName("div");

    foreach (HtmlElement div in divs)
    {
        //do something
    }
}

非常感谢。您能否给出一些提示,告诉我在Web浏览器控件中需要哪些方法/函数(导航、加载和查询)?再次感谢。 :) - user3213711
有没有办法在非UI程序中使用WebBrowser?我需要解析一个网页,其中部分由JavaScript生成,但我不需要UI。 - Spook
你好Pandepic, 在MVC中有没有方法可以做到这一点? 我知道我可以使用Iframes,但很多网站不允许跨域。 - Kadaj
有没有办法只通过控制台应用程序来实现? - Rakesh Yadav
这不是一个好主意,因为 .Net WebBrowser 会缓存您之前的操作,并且会占用计算机大量的内存。因此,更多的调用将导致它崩溃。 - MiMFa

4

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