js 抓取网页内容(本文是对《AJAX动态网页信息提取原理》的补充,前文总结了两种情况)
优采云 发布时间: 2021-09-27 01:03js 抓取网页内容(本文是对《AJAX动态网页信息提取原理》的补充,前文总结了两种情况)
本文基于《AJAX动态网页信息抽取原理》
另外,前一篇文章总结了两种在AJAX网页上抓取文本的方法:
网页文本是在加载 HTML 文档(document)时通过 Javascript 代码获取并显示的。这段 Javascript 代码在发送 load 事件之前运行,然后接收到 load 事件意味着所有内容都已加载。
网页文字是在加载HTML文档(document)后的某个时间用Javascript代码获取并显示的。这段Javascript代码在发送load事件之后运行,那么接收到load事件并不代表所有的内容都已经加载完毕,需要特殊的判别机制。
以上两种情况其实并没有考虑到AJAX的一个重要特性:异步加载。也就是说,HTML 页面的文本内容不是与 HTML 文档同步加载的,而是在某些情况下(例如,
例如,用户点击超链接)从服务器异步获取并显示。此时无法使用load事件触发网页文本爬取。DataScraper 从版本 V4.2.0B57 开始
它已得到增强,能够抓取异步加载的内容。
因为没有load事件触发fetch操作,所以必须进行合理的配置,通知DataScraper不要等待load事件。如果是定期自动抓取网页文字
, 通过设置调度指令文件
的
waitOnload 参数可以达到这个目的。但是在V4.2.0B57之前的版本中,所有手动发起的爬取都是waitOnload=true,即等待
load事件,在提取异步加载的内容时很可能发生:Timeout to load the page
错误。从 V4.2.0B57 版本开始,增加了 DataScraper 菜单:配置
-> 等待加载
, 这是一个复选框菜单,去掉钩子,不再等待加载事件。
比如MetaCamp服务器上有一个主题:demo_js_paging_sohu,用于获取搜狐名人博客
和
相关评论,评论内容是AJAX动态生成的,当名人博客很火的时候,会有很多评论,这些评论被分成多个页面,当用户点击“下一页”超链接时,新的没有加载
而是从网站异步获取下一页的评论内容,动态修改当前网页的DOM结构来显示。因此,没有页面加载就没有加载事件。翻页检索这些评论
理论上需要设置waitOnload=false,否则会遇到Timeout加载页面错误。
注意
: 异步加载的内容加载时,没有确切的时间点。人们在阅读网页时,可以根据上下文来理解和判断异步内容是否已加载。
然而,计算机程序无法理解语义。DataScraper 尝试使用智能方法进行判断,但仍有误判的可能,主要发生在目标网站的服务质量非常不稳定时
这时候异步加载内容和刷新显示的过程是间歇性的,而不是连续均匀的。这时候DataScraper就会做出误判。