phantom evaluate 遇js延时后随机值
前述
页面由js控制,"动态"出现广告链接。如目标站点中有个全屏广告,是等页面载入后在过数秒后出现广告的,等8秒后又消失。(如你将打开这个页面请关掉代理、禁用ABP类虑广告插件)
问题
我在用phantomJS 来抓取这些广告链接时,用page.evaluate 来计算js运行后的页面。在这里面来获取所有的a链接(这样做,只是为了更好的表达这个问题)。但是偶然发现,获取的a链接个数“随机"。 有时1850, 有时 1871,有时1872(这个才是所有的链接)。
对比
我也试过一个没有js延时后的页面,那样去抓取a的个数固定,但是像上面描述那种延时后的页面,抓取出来的值就是“随机”的。
猜想与疑问
看结果,既然能抓取到1872这个正确的数字,那么evaluate还是计算了js延时后的页面,但是这个随机是怎么回事呢?对js这块不熟,望大家指点
code
console.log('Loading a web page');
var page = require('webpage').create();
var url = 'http://cd.house.qq.com/';
page.open(url, function() {
var links = page.evaluate(function() {
return document.querySelectorAll("a");
});
console.log("有这么多a链接: " + links.length);
phantom.exit();
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我用你上面的代码试了10次,两次出现1872,其余的都是1873。
UPDATE
我在页面加载的http://jsqmt.qq.com/cdn_djl.js这个js文件中发现有个5秒钟的延时,如果在里面加一个断点,然后去取页面上
a
标签的个数,发现一直会比最终的结果少一个。在这个文件中加载了广告相关的东西,并生成了一个a
标签。由于有这个setTimeout
,因此并不能保证当phantomjs
的回调函数执行时,这个广告已经被加载。因为,若该页面的加载时间大于5秒的话,这时这个广告相关的代码就会被执行到,结果就会是最终的结果;但如果页面加载的时间小于5秒的话,这块代码就不会被执行到,得到结果就会少一个。我在浏览器中看到的页面加载完的时间是4s左右,具体值因网速而异。可能对方页面的javascript有根据时间,动态(创建/销毁)a元素的逻辑