首页 > phantom evaluate 遇js延时后随机值

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();
});

可能对方页面的javascript有根据时间,动态(创建/销毁)a元素的逻辑


我用你上面的代码试了10次,两次出现1872,其余的都是1873。


UPDATE

我在页面加载的http://jsqmt.qq.com/cdn_djl.js这个js文件中发现有个5秒钟的延时,如果在里面加一个断点,然后去取页面上a标签的个数,发现一直会比最终的结果少一个。在这个文件中加载了广告相关的东西,并生成了一个a标签。由于有这个setTimeout,因此并不能保证当phantomjs的回调函数执行时,这个广告已经被加载。因为,若该页面的加载时间大于5秒的话,这时这个广告相关的代码就会被执行到,结果就会是最终的结果;但如果页面加载的时间小于5秒的话,这块代码就不会被执行到,得到结果就会少一个。我在浏览器中看到的页面加载完的时间是4s左右,具体值因网速而异。

【热门文章】
【热门文章】