使用 C# 在 html 文档中抓取 JavaScript 动态生成的数据

IT技术 c# javascript html http dom
2021-03-01 13:31:19

如何使用 C# 在 html 文档中抓取 JavaScript 动态生成的数据?

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

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

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

非常感谢你!

2个回答

当您发出 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
    }
}
这不是一个好主意,因为 .Net WebBrowser 会缓存您之前的操作,并且会占用您计算机上的大量内存。因此,更多的调用会导致它崩溃。
2021-04-21 13:31:19
您好 Pandepic,有没有办法在 MVC 中做到这一点?我知道我可以使用 Iframe,但许多网站不允许交叉。
2021-04-26 13:31:19
有什么办法可以只从控制台应用程序做吗??
2021-05-03 13:31:19
非常感谢你。您能否提供一些有关我将需要的 Web 浏览器控件中的哪些方法/功能(导航、加载和查询)的提示?再次感谢。:)
2021-05-16 13:31:19
有没有办法在非 UI 程序中使用 WebBrowser?我需要解析一个部分由 javascript 生成的网页,但我不需要 UI。
2021-05-17 13:31:19

您可以看看像 Selenium 这样的工具来抓取具有 Javascript 的页面。

http://www.andykelk.net/tech/headless-browser-testing-with-phantomjs-selenium-webdriver-c-nunit-and-mono