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信息和网页结构的更新变化,同时减少其复杂性,提高其自动化和智能性,需要作进一步研究和探讨。

  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/webu/p/2751837.html
Copyright © 2011-2022 走看看