增强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就会出现误判。
相关文档:
scrollHeight: 获取对象的滚动高度。
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetL ......
使用过AJAX技术的人都知道大名鼎鼎的JQuery。虽然我来学习之前有看过AJAX的视频,但那时对WEB应用这个东西还比较模糊,不清楚HTML、JSP与Servlet是怎么工作的,甚至不知道JQuery包装的是什么东西。今日的学习再结合昨天的JavaScriptDOM的内容,让我对此十分清晰。JQuery原则:“write less, do more.” ......
今天偶然间看到一段JS代码:
......
<mce:script for="t" event="onclick"><!--
alert('hello');
// --></mce:script>
......
<a href="#" mce_href="#" id="t" ></a> hello </a>
.....
这是什么写法?
查了下W3C的 ......
<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%"
// 把 所有的 % 替换为 #
......
1. 短时间,形如 (13:04:06)
function isTime(str)
{
var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
if (a == null) {alert('输入的参数不是时间格式'); return false;}
if (a[1]>24 || a[3]>60 || a[4]>60)
{
alert("时间格式不对");
return false
}
return true;
}
2. 短 ......