增强AJAX/Javascript/JS网页文字抓取能力
本文是对《AJAX动态网页信息提取原理》
的补充,前文总结了两种AJAX网页文字的抓取方法:
网页文字在加载HTML文档(document)的时候用Javascript代码获取和展现,此Javascript代码在发送load事件之前运行,那么接收到load事件表示所有的内容都加载完了
网页文字在加载完HTML文档(document)后在某个时刻用Javascript代码获取和展现,此Javascript代码在发送load事件之后运行,那么接收到load事件并不表示表示所有的内容都加载完了,需要特别的判别机制。
上述两种情况实际上没有考虑AJAX的一项重要特性:异步加载。也就是HTML网页文字内容并不是与HTML文档同步加载的,而是在特定情形下(例
如,用户点击超链接)异步地从服务器上获取并展现的。此时,不能使用load事件触发网页文字抓取。DataScraper从V4.2.0B57版本开始
进行了增强,能够抓取异步加载的内容。
因为没有load事件触发抓取操作,要进行合理配置,告知DataScraper不要等待load事件。如果是周期性自动抓取网页文字
,通过设置排期指令文件
的
waitOnload参数就可以达到该目的,然而,在V4.2.0B57之前的版本,所有手工启动的抓取都是waitOnload=true,也就是等待
load事件,提取异步加载内容时很可能出现:Timeout to load the page
错误。从V4.2.0B57版本开始,增加了DataScraper菜单:配置
->等待load
,这是一个checkbox菜单,将钩去掉就不再等待load事件。
例如,MetaCamp服务器上有个主题:demo_js_paging_sohu,用于抓取sohu名人博客
和
相关评论,评论内容是AJAX动态生成的,当名人博客很受关注时,会有很多评论,这些评论分成多页显示,当用户点击“下一页”超链接时,并没有加载一个新
的HTML网页,而是异步从网站上获取下一页评论内容,动态修改当前网页的DOM结构进行展现,因此,没有页面加载就没有load事件。要翻页提取这些评
论,需要设置waitOnload=false,否则会遇到Timeout to load the page 错误。
注意
:异步加载的内容什么时候加载完了,没有一个确切的时间点,人阅读网页时,根据上下文可以理解并判断是否已经将异步内容加载上
了,但是计算机程序不能理解语义,DataScraper尽量使用一种智能方法加以判断,然而仍然有误判的可能,主要发生在目标网站的服务质量很不稳定的
时候,异步加载内容并进行显示刷新的过程是时断时续的,而不是持续的均匀地进行,此时,DataScraper就会出现误判。
相关文档:
JavaScript中的String是只读的,所以每次对String变量的操作都会在内存中产生一个零时变量,如果要对字符串进行大量的重复操作,性能和效率都会很低下,因此常用数组的方法操作字符串,即先把字符串都存储在数组中,然后使用join()方法连接字符串。
当然可以把这种方法再演变一下,在JavaScript中模拟StringBuffer类。
看 ......
使用的正则表达式的例子,但是没有说这些正则表达式如何使用,现在给大家几个例子,大家可以看看。
利用正则表达式判断是否是0-9的阿拉伯数字
function regIsDigit(fData)
{
var reg = new RegExp("^[0-9]$");
return (reg.test(fData));
}
利用这则表达式获取字符串的长度
function regDataLength(fData) ......
<script language="javascript">
<!--
String.prototype.replaceAll = stringReplaceAll;
function stringReplaceAll(AFindText,ARepText){
raRegExp = new RegExp(AFindText,"g");
return this.replace(raRegExp,ARepText)
}
var content = "%sfasf%sfd%asdfsadf%1111%"
// 把 所有的 % 替换为 #
......
<mce:script type="text/javascript" language="javascript"><!--
function del(com_id,meet_id){
$.ajax({
url:'../company/meet.Ajax.php',
type:'POST',
data:{com_id:com_id,meet_id:meet_id},
dataType:"json",
timeout: 10 ......