我想创建一个网络 __scraper__ 应用程序,并且我想使用网络浏览器控件、htmlagilitypack 和 xpath 来完成它。
现在我设法创建 xpath 生成器(我使用网络浏览器用于此目的),它工作正常,但有时我无法动态获取(通过 javascript 或 ajax)生成的内容。我还发现,当网页浏览器控件(实际上是 IE 浏览器)生成一些额外的标签,如“tbody”,同时又生成 htmlagilitypack
`htmlWeb.Load(webBrowser.DocumentStream);` 没有看到它。
另一个注释。我发现以下代码实际上获取了当前的网页源代码,但我无法提供 htmlagilitypack
`(mshtml.IHTMLDocument3)webBrowser.Document.DomDocument;`
你能帮我吗?
我只是花了几个小时试图让 HtmlAgilityPack 从网页渲染一些 ajax 动态内容,我从一篇无用的文章转到另一篇文章,直到找到这篇文章。
答案隐藏在最初的帖子下的评论中,我想我应该把它弄清楚。
这是我最初使用的方法,但没有成功:
private void LoadTraditionalWay(String url)
{
WebRequest myWebRequest = WebRequest.Create(url);
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
TextReader reader = new StreamReader(ReceiveStream, encode);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(reader);
reader.Close();
}
WebRequest 将不会呈现或执行呈现缺失内容的 ajax 查询。
这是有效的解决方案:
private void LoadHtmlWithBrowser(String url)
{
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(url);
waitTillLoad(this.webBrowser1);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)webBrowser1.Document.DomDocument;
StringReader sr = new StringReader(documentAsIHtmlDocument3.documentElement.outerHTML);
doc.Load(sr);
}
private void waitTillLoad(WebBrowser webBrControl)
{
WebBrowserReadyState loadStatus;
int waittime = 100000;
int counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
{
break;
}
counter++;
}
}
这个想法是使用能够呈现 ajax 内容的 WebBrowser 进行加载,然后等到页面完全呈现,然后再使用 Microsoft.mshtml 库将 HTML 重新解析到敏捷包中。
这是我访问动态数据的唯一方法。
希望它可以帮助某人
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)