zoukankan      html  css  js  c++  java
  • 基于Web过程模拟的动态Web信息获取

    介绍了分析相关Web页面的方法和经验,实现了自动提交HTML表单获得所需页面。采用性能优异的Web信息获取组件CURL,对大量科技文献网站的网页进行信息获取,实验表明CURL具有优异的处理速度,并成功应用到甘肃省科技文献共享平台的统一检索系统中。
    关键词:Web过程模拟;动态Web信息获取;CURL
    中图分类号:TP393
    随 着Internet的快速发展,Web资源已经成为一种人们获取信息的主要来源。但是对于需要查询的信息,很多网站必须经过注册登录后方可使用提供服务的 页面,而且各个网站的信息表示具有很大的异构性,给用户带来很大不便。为了访问Web上大量有用的信息,动态异构的Web信息获取方法就成为了一个研究的 热点。
    对于动态异构的Web资源,首先需要分析其网页表单,模拟用户点击行为找到结果页面,这些都是获取动态Web资源的难点问题;此外,Web 网站的动态变化对于保持信息抽取的准确性也是一个挑战,有待研究者去解决。文献[1-2]介绍了基于Web过程模拟的异构数字文献统一检索系统设计与实 现,但对基于Web过程模拟的动态Web信息获取原理及实现没有详细阐述。本文以获取科技文献资源网站的动态Web信息为例来说明问题。
    1 基于Web过程模拟的动态Web信息获取原理
    现 在很多网站提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册并登录后方可使用提供服务的页面。不同的资源对于登录有不同的限 制。由于与Web交互的细节需要人们自己来实现,这就需要人们对访问Web资源的细节进行模拟和描述,得到所需结果页面。
    源数据站点分析模拟是指对资源站点的页面结构进行分析,通过分析获取其请求参数用来模拟HTTP请求。其分析结果包括如何得到查询结果页面及其规律等。
    网页源数据站点分析与提取技术是实现和Web资源自动交互的基础,也是对所需网页提取数据的基础。一方面,与Web资源的交互过程中,有些参数和数据是通过网页分析与提取获得的;另一方面,得到的所需网页是通过网页分析和提取获得的。
    用 户通过浏览器来访问Web资源时,浏览器为用户隐藏了与Web资源交互的具体细节,用户看到的只是结果。对于需要查询的信息,一般需要通过Web浏览器登 录到一个Web服务器,输入查询条件,提交查询请求,服务器返回查询结果。由于用户与Web资源的交互是以HTTP协议为基础进行的,这种交互可以由程序 模拟出浏览器向远程Web服务器发送HTTP请求的过程。用户每查询一次信息,就是向服务器发送一次HTTP请求的过程。
    HTTP协议[3]是基 于请求/响应模式的。HTTP请求信息由请求行、请求头部域和请求实体三部分组成。请求行中的方法描述指定资源中应该执行的动作。常用方法有get、 post和head。请求头部域是关于该次请求的一些附加信息。请求实体则是该次请求所需传递的一些参数信息。HTTP响应信息由响应行、响应头部域和响 应实体三部分组成。响应行主要显示HTTP版本,以及此次响应结果的状态码;响应头部域为该次响应的附加信息;响应实体则为该次响应结果的详细信息。
    由 于可以通过程序模拟发送HTTP请求的过程,对于HTTP请求信息的获取是模拟成功的关键。有些Web服务程序的设计要求浏览器端通过脚本技术,对检索项 进行预处理,在浏览器端生成一个检索表达式,再将此表达式以HTTP请求的方式传递给服务器进行检索。在此情况下,需要分析HTML文件中的脚本代码,构 造出正确的检索表达式。有些请求信息参数是动态变化的。这需要人工仔细分析,找出其中规律,才能实现实时请求、实时响应,以及对查询页面的翻页等功能。这 些参数信息都不能有丝毫差错。可以借助已有的一些网络通信拦截工具软件,如Sniff’em、EHSniffer、HttpWatch、 HttpTracer等。这些软件可以捕获并解码浏览器发出的HTTP请求的数据,分析HTTP通信的网络活动等。这样就可以正确获取HTTP请求通信所 需的参数。
    2 Web信息获取工具
        通过程序模拟访问网页的方法有SOCKET通信方式、FOPEN方式、第三方组件(如:libcurl)等。当网页文件很大或者网页根本不存在的时候,使 用FOPEN的方法经常会出现超时。在实际工程应用中,必须考虑系统的性能及可移植性。Web信息获取工具是系统性能好坏的一个最重要的技术环节,不论是 采用PHP中的SOCKET通信方式还是FOPEN方式都不能胜任如此频繁的文件获取时间要求。系统采用性能优异的CURL访问组件,该组件远程访问速度 比传统方式速度快了近200倍,采用FOPEN方式对于100个HTTP文件请求每分钟只能打开10个,而采用CURL组件方式对于2000个HTTP文 件请求每分钟可以打开2000个[4]。该组件支持FTP,FTPS,TFTP,HTTP,HTTPS,TELNET,DICT,FILE和LDAP协议 的访问,极大地提高了Web会话的速度和协议范围。此外,该组件支持多种开发语言工具的驱动,主要包括C、C++、PHP、PERL、JAVA、.NET 等,支持广泛的操作系统,包括Solaris、NetBSD、FreeBSD、OpenBSD、HPUX、IRIX、AIX、Tru64、Linux、 UnixWare、Windows等,具有广泛的可移植性,为程序开发打造了良好的接口。
    3 实现及应用实例
       基于CURL的动态Web信息获取方法已应用于甘肃省科技文献共享平台[5]的统一检索系统。该系统采用PHP5.0作为开发工具,Apache 2.0作为Web服务器。
    以下是模拟检索重庆维普中文科技期刊数据库题录信息的简单实现:
    以检索题名为cad,年限为2002-2007的数据为例。
    首先用网络通信拦截工具软件Sniff’em捕获请求,结果如下:
    POST /CSTJ/Sear.dll?SearchZK HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Referer: http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; POTU(RR:27062616:0:5064085); TencentTraveler )
    Host: vip.gsinfo.net.cn
    Content-Length: 215
    Connection: Keep-Alive
    Cache-Control: no-cache
    Cookie: GTZ=-480; ASPSESSIONIDAQQSSRRS=IKDLFENCMFAIGAMBEJFIMMKL; WebSite=YW=0; CSID=%7BDAF8D431%2D845D%2D4B0F%2D9F49%2DEEC550C0438F%7D061%2E178%2E020%2E160; VIPCSID=%7BDAF8D431%2D845D%2D4B0F%2D9F49%2DEEC550C0438F%7D; User=YR=1989%2C2016&UN=1&YWBrowse=0&UserID=1&UR=ZZ&Alllist=1&Name=guest
    E=%3C1%2C4%3E%3A%28%28Title_C%3DCAD%29*Years%3D%282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20&P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=&KM=&GX=&CSID=%7BDAF8D431-845D-4B0F-9F49-EEC550C0438F%7DHTTP/1.1 200 OK
    Connection: close
    Date: Sun, 23 Mar 2008 02:24:35 GMT
    Server: Microsoft-IIS/6.0
    X-Powered-By: ASP.NET
    可以看到,这个请求使用了POST命令,向http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK发出请求,后面几行是这个请求的一些附加字段信息,倒数第五行是这个请求的HTTP Body,其内容就是POST命令所要附带的数据,是经过HTML编码的一个字符串,解码后为:
    E=& lt;1,4>:((Title_C=CAD)*Years=(2002+2003+2004+2005+2006+2007))& S=1&N=20&P=1&C=0&H=(题名=CAD)*Year=2002-2007&M=& KM=&GX=&CSID={DAF8D431-845D-4B0F-9F49-EEC550C0438F}
    以下是用CURL组件实现这个请求的PHP代码:
    <?
    $bench = new Tii_Timer;    //实例化一个计时类对象
    $bench->start();           //计时开始
    $bench->setMarker(‘Start of the script');
    $url="http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK";
    $param="E=%3C1%2C4 %3E%3A%28%28Title_C%3DCAD%29*Years%3D %282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20& P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=& KM=&GX=&CSID=%7BDAF8D431-845D-4B0F-9F49-EEC550C0438F%7D"; //指定POST数据
    ob_start();                                     //打开输出缓冲区
    $ch = curl_init()[6];                            //初始化会话
    curl_setopt( $ch, CURLOPT_URL, $url );         //设定目标URL
    curl_setopt( $ch, CURLOPT_POST, 1 );           //设定表单发送方式为POST
    curl_setopt($ch,CURLOPT_POSTFIELDS,$param);   //POST数据
    curl_exec($ch);                               //发送请求
    $retrievedhtml = ob_get_contents();             //返回内部缓冲区的内容
    ob_end_clean();                   //删除内部缓冲区的内容并关闭内部缓冲区
    curl_close( $ch );                //会话结束
    $bench->stop();                   //计时结束
    $resp = $bench->getProfiling();
    echo $resp[2][diff]."S";          //输出计时时间
    ?>
    现在获取的信息就在$retrievedhtml中,然后就可以对获取的信息进行分析,得到元数据。
    用CURL组件实现这个请求的平均时间是0.62S.
        以下是用FOPEN方式实现这个请求的PHP代码:
    <?
    $bench = new Tii_Timer;    //实例化一个计时类对象
    $bench->start();           //计时开始
    $bench->setMarker('Start of the script');
    $url="http://vip.gsinfo.net.cn/CSTJ/Sear.dll?SearchZK";
    $param="E=%3C1%2C4 %3E%3A%28%28Title_C%3DCAD%29*Years%3D %282002%2B2003%2B2004%2B2005%2B2006%2B2007%29%29&S=1&N=20& P=1&C=0&H=%28%CC%E2%C3%FB%3DCAD%29*Year%3D2002-2007&M=& KM=&GX=&CSID=%7B7CC87A4E-5D78-41D7-B8D9-289746EFA53E%7D"; //指定POST数据
    $fp = fopen($url.'?'.$param, "r");     //发送请求
    $retrievedhtml = "";
    do {                                    //读取返回的信息
       $data = fread($fp, 8192);
       if (strlen($data) == 0) {
       break;
       }
       $retrievedhtml .= $data;
    } while(true);
    fclose($fp);
    $bench->stop();
    $resp = $bench->getProfiling();
    echo $resp[2][diff]."S";
    ?>
    用FOPEN方式实现这个请求的平均时间是1S.
    虽然通过这个例子不能说明用CURL组件实现动态Web信息获取的优越性能,但经过大量的实验,如:通过访问清华同方CNKI数据库、万方数据库、NSTL数据库等文献资源网站,表明,用CURL组件实现动态Web信息获取的性能远优于用FOPEN方式。
    4 技术难点和重点
    4.1 检索选项到检索表达式的转换
        对于要传递给Web服务器的检索选项,根据Web服务器设计的不同,需要做相应的处理,有的Web服务器只需要浏览器端直接返回选项值,由服务器端程序进 行逻辑处理后返回结果;有些Web服务程序的设计要求浏览器端通过脚本技术,对检索选项进行预处理,在浏览器端生成一个检索表达式,再将此表达式以 HTTP请求的方式传递给服务器进行检索,在这种情况下,开发人员需要分析HTML文件中嵌入的脚本代码或引用的脚本文件,理清各个检索选项到检索表达式 的转换关系,才能构造出正确的检索表达式。例如,有些网站的翻页链接或全文链接是Javascript写成的脚本命令,在HTML源代码中的静态文本是固 定的,但实际指向的真正链接,却需要在脚本函数中动态生成。
    4.2 连接状态的管理
        目前的检索系统都应用了Session(如:上例中POST数据中的CSID=%7BDAF8D431-845D-4B0F-9F49- EEC550C0438F%7D)技术,为了解决Session过期和各文献数据库限制并发访问数的问题,采用了检索时一次性释放检索系统Session 会话的机制,当翻页时再次建立检索系统Session会话。此外,各文献数据库都限制了并发访问数,通过这个方法能很好解决这个问题。
    4.3 多任务开发
    尽 管PHP的优势主要在于优异的字符运算处理速度和可靠性,通过与Apache 2.0 Web服务器的组合使得统一检索系统具备了良好的稳定性和性能,但它本身不支持多线程,而统一检索系统需要对多个数据库同时进行检索,如果是普通的单线程 程序,处理速度会慢得让人无法忍受,本文使用Ajax技术实现多任务编程技术,以提高程序的运行效率、避免程序界面出现“假死”状态。
    Ajax对 Web服务的通信调用过程分为同步调用和异步调用,同步调用好处是一次性将用户的所有请求并发处理,但对于统一检索系统来说,多个资源数据库的检索响应将 受限于耗时最长的资源数据库,用户等待时间较长,服务器端并发处理的压力较大。采用异步调用方式可很好的解决这一问题,用户按需发出请求,用户发出的多个 资源数据库的检索在服务器端是按线程处理的,用户请求的响应以服务器处理结果为准,检索处理过程互不影响,大大缩短了用户的总体响应时间,降低了服务器的 并发处理压力,在用户端等待数据处理结果时,可进行其它资源库的检索,实现了多任务检索处理和操作。
    5 结语
        本文针对动态Web信息获取问题,介绍了基于Web过程模拟的解决方法。该方法主要用于如何得到查询页面和实现信息抓取。如何提高对多种网页结构的适应 性,以及感知Web信息和网页结构的更新变化,同时减少其复杂性,提高其自动化和智能性,需要作进一步研究和探讨。

  • 相关阅读:
    js获取input file完整路径的方法
    form提交表单上传图片
    基于HTML5的可预览多图片Ajax上传
    ie11兼容
    上传时获取文件的完整路径图片预览的js代码(兼容Firfox和IE)
    学习笔记
    ie浏览器兼容性(ie9,ie10)
    大学最后悔的事
    easyui 分页
    jQuery学习
  • 原文地址:https://www.cnblogs.com/webu/p/2751837.html
Copyright © 2011-2022 走看看