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

Posted

技术标签:

【中文标题】使用 C# 在 html 文档中抓取由 JavaScript 动态生成的数据【英文标题】:Scraping data dynamically generated by JavaScript in html document using C# 【发布时间】:2014-07-30 14:32:03 【问题描述】:

如何?

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

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

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

非常感谢!

【问题讨论】:

您必须通过某种 JavaScript 引擎来运行它。也许像Awesomium这样的东西? 看这里:***.com/questions/18539491/… 【参考方案1】:

当您发出 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 浏览器控件中的哪些方法/功能(导航、加载和查询)提供一些提示?再次感谢。 :) 有没有办法在非UI程序中使用WebBrowser?我需要解析一个网页,该网页部分由javascript生成,但我不需要UI。 你好 Pandepic,有没有办法在 MVC 中做到这一点?我知道我可以使用 iframe,但许多网站不允许交叉。 有什么方法可以仅从控制台应用程序中执行吗?? 这不是一个好主意,因为 .Net WebBrowser 会缓存您以前的操作,它会占用您计算机上的大量内存。因此,更多的调用会导致它崩溃。【参考方案2】:

你可以看看像 Selenium 这样的工具,用于抓取具有 Javascript 的页面。

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

【讨论】:

以上是关于使用 C# 在 html 文档中抓取由 JavaScript 动态生成的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 Visual Studio 2010 中使用正则表达式或 HTMLAgilityPack 抓取 HTML 页面的特定部分?

利用Abot 抓取博客园新闻数据

如何在 aspx.cs 文件中抓取 HTML 元素(复选框)C#

C#利用phantomJS抓取AjAX动态页面

Python中的HTMLParsercookielib抓取和解析网页从HTML文档中提取链接图像文本Cookies

Python爬虫基础