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

原文地址:https://www.cnblogs.com/webu/p/2751837.html