phantom evaluate 遇js延时后随机值

发布于 2022-08-30 00:30:48 字数 852 浏览 6 评论 0

前述

页面由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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

微暖i 2022-09-06 00:30:48

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

图片描述


UPDATE

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

冰雪梦之恋 2022-09-06 00:30:48

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文