时间:2022-10-12 04:06:27
摘要:为解决对一些公共数据的搜集和整理问题,研究了运用AJAX(Asynchronous JavaScript and XML)和正则表达式技术对远程数据进行采集的方法。实例基于AJAX的异步通信技术设计了远程采集方法,通过分析被采集数据的代码特征,利用正则表达式构建了“规则字符串”,从而对被采集数据进行匹配过滤后获取有价值的数据。实验结果表明,该方法有效且可行,为收集和整理分散在互联网上的孤立数据再利用提供了高效而简便的的解决途径。
关键词:数据采集;Ajax;正则表达式;javascript;XML
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)13-2996-04
互联网的浪潮改变了人们的生活,改变了人们传播和获取信息的方式,信息不再受空间、地域的限制,而在信息呈现爆炸式增长的海量信息中,有时需要将公共数据从远程采集并加以利用,随着AJAX技术的发展,利用AJAX异步传输技术、正则表达式技术对远程数据进行采集和匹配检索,即可实现轻量级的远程数据采集。
1功能说明
本文将利用Ajax的异步通讯技术访问WEB上的远程页面,然后利用正则表达式强大的字符匹配能力对获取的数据进行分析,从而获取所需的有效数据。
2开发过程
2.1分析数据采集页面,制定采集策略
数据采集首先需要对页面进行分析,制定采集的基本策略,在这里我们以“国家药品食品监督管理局”药品数据为例,页面如图1:
图1
分析页面源代码,发现可以通过查询的方式获取内容列表,具体地址是:
app1.sfda.省略/datasearch/face3/search.jsp?tableId=25
通过这个地址访问后可以看到如下图2的页面:
图2
通过浏览器的查看页面源代码,我们可以看到下面的代码片段:
<form method="post" id="pageForm" name="pageForm" action="search.jsp">
<input type="hidden" name="tableId" value="25">
<input type="hidden" name="bcId" value="">
<input type="hidden" name="curstart" value="">
<input type="hidden" name="tableName" value="TABLE25">
<input type="hidden" name="viewtitleName" value="COLUMN167">
<input type="hidden" name="viewsubTitleName"
value="COLUMN166,COLUMN170,COLUMN821">
<input type="hidden" name="keyword" value="">
<input type="hidden" name="tableView" value="国产药品">
</form>
根据分析得出tableId的值为25的时候表示访问国产药品数据,不同的tableId的值表示搜索不同的药品数据库;curstart的值表示数据列表所在的当前页数。因此可以用GET方式构建访问不同药品数据库中的具体某一页面数据列表的地址,例如需要访问国产药品数据中的第10页,构建地址:app1.sfda.省略/datasearch/face3/search.jsp?tableId=25&curstart=10
到这里就已经取得了远程数据列表的原始地址,接下来就可以通过AJAX技术对它进行远程采集。
2.2利用Ajax访问远程页面获取数据
建立XMLHttpRequest对象xmlHttp进行远程数据访问,通过xmlHttp.ResponseTEXT接受返回数据,这里URL变量是经过第一步分析以后手工构建的访问地址,当然在实际过程中可以通过一个循环来构建所有的访问地址,核心代码如下:
var xmlHttp;
var url;
url="app1.sfda.省略/datasearch/face3/search.jsp?tableId=25&bcId=124356560303886909015737447882&curstart=2";
if (window.ActiveXObject){
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp=window.XMLHttpRequest();
}
xmlHttp.open("GET",url);
xmlHttp.send(null);
通过AJAX发送远程请求后,并根据AJAX的readyState属性和status属性判断访问的状态得知是否访问成功,然后接受返回数据,核心代码如下:
if (xmlHttp.readyState==4)
if (xmlHttp.status==200)
{
var hDOM=xmlHttp.ResponseTEXT;
}
}
由于返回数据太长,我们这里就不全部显示出来:
<!--?????????-->
<table width=100% border=0 cellspacing=0 cellpadding=0>
<tr>
<td height=27 bgcolor=#659ACE>
<table width=100% border=0 align=center cellpadding=0 cellspacing=0>
<tr>
<td width=20> </td>
<script>alert(’xx11’);</script>
<td><div align=left class=zs2>"国产药品"的内容列表,共有187738条记录</div></td></tr>
<script>alert(’xx22’);</script>
</table></td></tr>
</table>
<table width=100% border=0 cellspacing=0 cellpadding=0>
<tr>
<td height=30><p align=left>
<a href=javascript:commitForECMA(callbackC,’content.jsp?tableId=25&tableName=TABLE25&tableView=国产药品&Id=188721’, null)>16.盐酸右美托咪定注射液(国药准字H20110097四川国瑞药业有限责任公司86909556000017)</p></td></tr>
<tr>
<td height=1 background=images/data01_04.gif></td></tr>
<tr>
<td height=30><p align=left>
<a href=javascript:commitForECMA(callbackC,’content.jsp?tableId=25&tableName=TABLE25&tableView=国产药品&Id=188737’, null)>17.阿德福韦酯(国药准字H20110087河南圣凡制药有限公司86903092000838)</p></td></tr>
<tr>
<td height=1 background=images/data01_04.gif></td></tr>
<tr>
……
2.3利用正则表达式匹配检索
在使用正则表达式分析之前,必须先对返回的源代码进行一下分析,找到匹配的特征代码,根据分析每一条数据列表发现,每一条数据都从“null)>”开始,到“</p></td>”结束。
根据这个特征构建正则表达式:
var strarr
var re;
re=/null\)>.*<\/p><\/td>/ig;
strarr=hDOM.match(re);
通过正则表达式的匹配后得到strarr数组,存储的是每一条的原始数据:
“136.奥美沙坦酯(国药准字H20061311北京万生药业有限责任公司86900177000042)”
至此就已经获取到了最原始的数据,为了获得每一个数据项,需要对原始数据内的无用数据进行替换,并把替换后的数据进行分割,得到具体的每一个数据项。
for(i=0;i<strarr.length;i++)
{
strarr[i]=strarr[i].replace(/\d*\.|null\)>|<.*>|\(|\)|\f\n\r*/ig,""); //去除获取的内容中的多余代码
var temp;
temp=strarr[i].split(" ");
最终,数组strarr内记录了每一各数据项的数据,根据需要们就可以将数据写入数据库保存或XML文件保存,如图3:
<img src="192.168.2.81/QKimg.省略/qkimages/dnjl/dnjl201213/dnjl20121323-3-l.jpg" />
图3
3结束语
本文展现了利用Ajax和正则表示技术对远程数据采集的原理和思路,在此基础上各位可以扩展以适应不同的应用,灵活利用Ajax的异步传输技术更是可以实现原来传统WEB开发中难以实现的功能。
参考文献:
[1] Andrew Watt.Beginning Regular Expressions[M].北京:清华大学出版社,2005.
[2] Christian Heilmann.Beginning JavaScript with DOM Scripting and Ajax[M].北京:人民邮电出版社,2006.
[3] Ryan Asleson,Nathaniel T.Schutta.Foundations of Ajax[M].北京:人民邮电出版社,2005.