我是在电信工作的,应部门要求,开发一个分析话费的系统,但是我不会提取所需要的数据,想请大家帮忙出注意:具体情况如下:
1、公司已经有了一个计费系统,基于网页的B/S结构,公司不愿意对本部门提供该系统的技术支持,更不愿意公布接口参数,也就是说现在只知道其使用XML格式下载加密的话费信息到浏览器,并在浏览器使用脚本 + 控件的形式进行解密重组数据块后,最后将最终话费显示在屏幕上面。对于解密机制目前还无法分析通过什么算法。注意:本帖要解决的问题就是:我需要的是显示在屏幕上的那些话费信息,以做更进一步的话费分析。
2、我使用C#的asp.net进行开发,我设想用asp.net服务器向计费系统请求网页,并在服务器上做分析,分析结果发送给asp.net用户。
请大家提供方法提取网页上显示的数据,可以通过多种方法来提取,比如使用脚本语言等,但最好是用asp.net进行提取所需数据,毕竟我对asp.net比较熟悉,我想给大家更多分数,但csdn上我最大只能给100分,很抱歉。

解决方案 »

  1.   

    try用js吧 
    做个<iframe src = "计费网址" id="sFrameName" height=0 />
    var doc = document.frames("sFrameName").document;
    分析 这个 doc 的 dom
      

  2.   

    注意以上语句运行的时间,要在iframe 装入完毕后再运行
    <iframe src = "计费网址" id="sFrameName" height=0 onload = "分析的js"/>
      

  3.   

    webclient 
    httpRequest
      

  4.   

    恩 只能用js了.hdt(倦怠) 的代码试试
      

  5.   

    //获取http页面函数 
            public string Get_Http(string a_strUrl)
            {
                string strResult;
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(a_strUrl);
                myReq.Method = "GET";
                myReq.Accept = "*/*";
                myReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";            try
                {
                    HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();                string tmp = myReq.Headers.ToString();                Stream myStream = HttpWResp.GetResponseStream();                StreamReader sr = new StreamReader(myStream, Encoding.UTF8);
                    StringBuilder strBuilder = new StringBuilder();
                    while (-1 != sr.Peek())
                    {
                        strBuilder.Append(sr.ReadLine() + "\r\n");
                    }                strResult = strBuilder.ToString();
                    myStream.Close();
                    sr.Close();            }
                catch (Exception exp)
                {
                    strResult = "错误:" + exp.Message;
                }
                return strResult;        }
    主要用到这个方法,把页面放到a_strUrl中,然后遍历参数的值。再结合正则表达式。
      

  6.   

    webClient + 正则表达式分解
      

  7.   

    忍不住在多说几句
    HttpRequest,webclient ,都不行,主要是因为以上只能下载网页的源码,而无法执行网页内的javascript,webbrowser因该可以,但在客户端使用就比较麻烦啦
      

  8.   

    学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:32801051
      

  9.   

    既然是xml数据不就简单了,看懂js的解密函数,自己重新写一遍,或者直接用js的,把xml解密以后用个xml解析器,想要什么出什么,xslt也可以.
      

  10.   

    HttpRequest+正则表达式。。要找到最终显示话单信息的页面,你说是XML加密传下来的,那本地肯定会有一个JS的解密过程,你就取这个解密之后的数据进行分析调整,存为你需要的内容。
      

  11.   

    JS 做的解密,应该是可以抄出来用C#重写的
      

  12.   

    谢谢大家的支持,我希望的是直接获取显示在屏幕的值,不知道是否有办法获取,这样就不用直接分析网页,而是分析网页显示出来的数据了。    因为这个显示话费的网页使用了大量的js文件,就目前简单收集并分析的关键js文件就有近百个,最BT的是:最小的文件也有10多K的数据,大的也有百来K的数据,真是够BT。前台显示计费数据(包括话费、优惠信息、补退费等七十多个功能项目)的页面,就只有一个框架,子框架和子页面、项目数据等都是由js在浏览器生成的,真是让人头都大。    所以我希望直接获取页面显示的数据,这会使程序更简单得多。希望高手们多多指点,谢谢:)  总不能告诉我采用截图,再识别图片上的文字吧?呵呵。如果我给的分数不够吸引人,我还可以另开帖:)
      

  13.   

    重要的是相当一部分js文件(近百个文件,有重复文件)已被截取下来了,但是我对js不熟,很难分析并重写啊。或者有哪位同志对js比较熟的?帮忙分析一下喂
      

  14.   

    请问楼主
    “浏览器使用脚本 + 控件的形式进行解密重组数据块后”
    中的控件是指的浏览器端需要安装的那种ActiveX控件或者java Aplet控件吗?1 如果是这两种控件,及时你获取到了网页,也不能做源码分析的。
    2 如果那个控件是服务器端控件,浏览器端能解释成一般的HTML,那么楼主可以采用AJAX的方式进行web请求,获取到请求页的返回HTML后,可用javascript中的模式匹配、split之类的方法进行源码分割。然后再使用javascript提取有用部分的数据做成数组之类的参数,传递给后台的分析计算Webservice方法获取目标页HTML,并用javascript进行提取有效部分的方法可以参照我博客的文章:
    《小巧适用的AJAX英汉汉英字典》
    http://www.cnblogs.com/heekui/archive/2007/01/31/635762.html 
      

  15.   

    如果不熟悉javascript,也可以直接采用C#的方式,例如:
    //获取中国标准时间(由美国官方时间折算)
    private void GetNistTimeCN( out string time, out string Data )
    {
    try
    {
    //nist.time.gov的url
    string strNistUrl = "http://nist.time.gov/timezone.cgi?UTC/s/0"; //构造并实例化一个WebRequest
    System.Net.WebRequest myHttpWebRequest = System.Net.HttpWebRequest.Create( strNistUrl );
    //设置连接超时时间
    myHttpWebRequest.Timeout = 8000;
    //设置WebResponse,接收返回信息
    System.Net.WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse();
    //获取返回信息流信息
    Stream sr = myHttpWebResponse.GetResponseStream();
    //设置流阅读器
    StreamReader reader = new StreamReader(sr, System.Text.Encoding.ASCII);
    //流输出为字符串
    String srdata = reader.ReadToEnd();
    //将返回html文本中的双引号变为单引号
    srdata = srdata.Replace( "\"","\'");

    //用模式匹配加分割的方式定位和获取时间信息
    string strOut = Regex.Split( srdata, "color='white'><b>" , RegexOptions.IgnoreCase)[1];
    string strTime = Regex.Split( strOut , "<br>", RegexOptions.IgnoreCase )[0];
    //小时需调整,因时区相差8小时
    time = DateTime.Parse( strTime ).AddHours( 8 ).ToLongTimeString(); //用模式匹配加分割的方式定位和获取日期信息
    string strOut1 = Regex.Split( srdata, "'5' color='white'>" , RegexOptions.IgnoreCase)[1];
    string strData = Regex.Split( strOut1 , "<br>", RegexOptions.IgnoreCase )[0];
    //获取中国时间-小时部分
    int intHourCn = int.Parse( time.Split( ':' )[0] );
    //获取美国时间-小时部分
    int intHourUS = int.Parse( DateTime.Parse( strTime ).ToLongTimeString().Split( ':' )[0] );
    //比较小时差异,调整日期差异
    if ( intHourCn < intHourUS )
    {
    Data = DateTime.Parse( strData ).AddDays(1).ToShortDateString();
    }
    else
    {
    Data = DateTime.Parse( strData ).ToShortDateString();
    }
    }
    catch( System.Exception ex )
    {
    time = string.Empty;
    Data = string.Empty;
    MessageBox.Show( "获取时间出错:" + ex.Message );
    }
    }
      

  16.   

    qwerttyy(猫猫抱抱狗狗跳跳)家说得也是,但这也是为了方便大家工作才做的。针对各位提出的问题,我查清楚了,网页所用的就只有js,是客户端控件,截取网页的源码是没有任何作用的,只有截取网页上所显示的内容才有作用。还是希望大家多帮帮忙了,毕竟这也能提高大家的编程水平,我自身也能得到提高,关于截取网页内容的问题实在非常麻烦,请大家多给点意见,谢谢了。
      

  17.   

    webrequest请求数据
    webresponse获取数据
      

  18.   

    tesling你说的
    webrequest请求数据
    webresponse获取数据能说得详细一点吗?
      

  19.   

    楼主看看我提供的实例代码,里面有的System.Net.WebRequest
    System.Net.WebResponse
      

  20.   

    benq2003(Visual奎#.Net 2005) ( ) 信誉:100    Blog 
    牛比人物呀
      

  21.   

    benq2003(Web.奎.2007) ( ) 信誉:100    Blog 能告诉我一下连接在哪吗?我找不到你说的文章
      

  22.   

    这个帖子的上面啊,再把它贴到下面来。原理基本就是这样的//获取中国标准时间(由美国官方时间折算)
    private void GetNistTimeCN( out string time, out string Data )
    {
    try
    {
    //nist.time.gov的url
    string strNistUrl = "http://nist.time.gov/timezone.cgi?UTC/s/0";//构造并实例化一个WebRequest
    System.Net.WebRequest myHttpWebRequest = System.Net.HttpWebRequest.Create( strNistUrl );
    //设置连接超时时间
    myHttpWebRequest.Timeout = 8000;
    //设置WebResponse,接收返回信息
    System.Net.WebResponse myHttpWebResponse = myHttpWebRequest.GetResponse();
    //获取返回信息流信息
    Stream sr = myHttpWebResponse.GetResponseStream();
    //设置流阅读器
    StreamReader reader = new StreamReader(sr, System.Text.Encoding.ASCII);
    //流输出为字符串
    String srdata = reader.ReadToEnd();
    //将返回html文本中的双引号变为单引号
    srdata = srdata.Replace( "\"","\'");//用模式匹配加分割的方式定位和获取时间信息
    string strOut = Regex.Split( srdata, "color='white'><b>" , RegexOptions.IgnoreCase)[1];
    string strTime = Regex.Split( strOut , "<br/>", RegexOptions.IgnoreCase )[0];
    //小时需调整,因时区相差8小时
    time = DateTime.Parse( strTime ).AddHours( 8 ).ToLongTimeString();//用模式匹配加分割的方式定位和获取日期信息
    string strOut1 = Regex.Split( srdata, "'5' color='white'>" , RegexOptions.IgnoreCase)[1];
    string strData = Regex.Split( strOut1 , "<br/>", RegexOptions.IgnoreCase )[0];
    //获取中国时间-小时部分
    int intHourCn = int.Parse( time.Split( ':' )[0] );
    //获取美国时间-小时部分
    int intHourUS = int.Parse( DateTime.Parse( strTime ).ToLongTimeString().Split( ':' )[0] );
    //比较小时差异,调整日期差异
    if ( intHourCn < intHourUS )
    {
    Data = DateTime.Parse( strData ).AddDays(1).ToShortDateString();
    }
    else
    {
    Data = DateTime.Parse( strData ).ToShortDateString();
    }
    }
    catch( System.Exception ex )
    {
    time = string.Empty;
    Data = string.Empty;
    MessageBox.Show( "获取时间出错:" + ex.Message );
    }
    }
      

  23.   

    比较复杂,不过,既然都只有Js,那就一定可以解决的了。
    我25上班,方便的话,Q上聊。
    99363590我有十成的把握解决这个问题。
    不过,我也担心是否会是侵权……
    因为你的情况好奇怪,这么难的东西,别的部门怎么可能不协作的。