zoukankan      html  css  js  c++  java
  • winform与web交互问题总结

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

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

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


    --------------------------------------------------------------------------
    Daniel Chow's Blog - 不管你在哪里,都要有一颗创业的心!
    http://www.cnblogs.com/DanielChow/
  • 相关阅读:
    Windows Azure 网站开发Stacks支持
    AzureDev 社区活动获奖者公布
    Android 改变窗口标题栏的布局
    cocos2d-x游戏开发系列教程-超级玛丽01-前言
    cocos2dx进阶学习之CCObject
    基于visual Studio2013解决算法导论之055拓扑排序
    查看某文件夹内文件大小
    vmstat命令
    uname 命令
    iostat命令
  • 原文地址:https://www.cnblogs.com/DanielChow/p/1794839.html
Copyright © 2011-2022 走看看