winform与web交互问题总结

时间:2020-12-02 21:14:09

最近做数据采集,碰到了很多钉子,这里一一记录下来。

很久没写东西了... ,不是没有写的,是没心情写,想的太多了,在想些什么,自己也说不清楚,往大了说关于人生,往小了说关于怎么活。扯远了,不废话了。

1、选择什么方式去采集?

网上方式很多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,去找到那个窗体然后去点击上面的某个按钮。