首页  ·  知识 ·  
Label
      编辑:  图片来源:网络
、选择什么方式去采集?

网上方式很多WebClient,WebRequest和WebBroswer,分析需求之后选择 WebBroswer ,

原因有几点:

a、很多地方需要登陆之后才能采集,要做模拟登陆就会牵扯到状态保存问题等等

b、多级页面跳转,也需要模拟去触发点击事件

c、Ajax页面数据采集

2、WebBroswer 的加载状态问题,页面什么时候加载完?

WebBroswer 加载状态一个页面时候加载完 , 一开始是一个很头疼的问题 , 写了个Demo发单凭WebBrowser.ReadyState是不可靠的 , 有人直接延时,但延多少根本没办法确定。

后来测试发现WebBrowser_DocumentCompleted事件会重复触发,造成业务逻辑混乱,找到问题之后就好办了,用完就去掉它这个委托。

if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

3、如何查找某Html元素?
 

HtmlDocument hDoc = webBrowser1.Document;
for (int i = 0; i < hDoc.All.Count; i++)
{
if (hDoc.All[i].TagName.ToUpper().Equals("INPUT"))
{
if (hDoc.All[i].GetAttribute("type").Trim().Equals("button"))
{
hDoc.All[i].InvokeMember(
"click"); //触发它的事件
break;
}
}
}

 

4、如何获取Ajax页面动态加载的数据?

if (WebBrowser.ReadyState != WebBrowserReadyState.Complete || WebBrowserst.StatusText != "完成" && !WebBrowser.IsBusy) return;

然后再用timer延时2秒去取WebBrowser.Document,就可以了

5、如何给WebBroswer加入内容?

//例如注册脚本
HtmlElement ele = webBrowser1.Document.CreateElement("script");
ele.SetAttribute("type", "text/javascript");
ele.SetAttribute("text", "function aa(s){alert(s);}");
WebBrowser.Document.Body.AppendChild(ele);

6、如何调用WebBroswer加载页面内的Js方法?

WebBrowser.Document.InvokeScript("aa", new object[] {'Hi , daniel;!'});

7、采集回来的Html代码不完整或者对方的代码本来就有问题怎么办?

这里要去修复Html代码,我用的HtmlParser,但效率不怎么样,目前还没发现更好的!

8、页面弹出错误脚本怎么办?

这里要分清是网页弹出来的还是浏览器弹出来的,WebBrowser本省就是一个浏览器。

如果是网页弹出来的,可以通过注入脚本去覆盖原来的alert方法,如果是浏览器的可以把WebBrowser.ScriptErrorsSuppresse设为True.

9、文件下载弹出框怎么处理?

我的解决办法是采用系统API,去找到那个窗体然后去点击上面的某个按钮。

本文作者:winform与web交互 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的
收藏至微信