CasperJS示例代码无法运行问题求助
排查CasperJS爬取导航链接失效的问题
嘿,我来帮你拆解这段代码跑不起来的原因,主要是这几个关键点出了状况:
1. 页面结构更新,选择器失效了
最核心的问题是CasperJS官网的DOM结构已经变了,你写的ul.navigation li a这个选择器根本找不到对应的导航元素啦。现在官网的导航栏早就不是原来的ul.navigation结构了,你可以自己打开官网右键检查导航栏元素,比如现在导航链接是在header下的nav里,类名可能是navbar-nav,所以得把选择器改成当前页面实际有效的,比如.navbar-nav li a(具体以你检查到的为准)。
2. HTTP跳转HTTPS的坑
你代码里用的是http://casperjs.org/,但现在这个域名会自动跳转到HTTPS协议的地址。虽然CasperJS默认会处理跳转,但有时候跳转后的页面加载可能有延迟,导致还没等导航元素出来就执行了evaluate,自然拿不到数据。建议直接用HTTPS地址访问,再加上waitForSelector等待元素加载完成:
casper.start('https://casperjs.org/'); // 直接用HTTPS避免跳转 casper.waitForSelector('.navbar-nav li a', function() { links = this.evaluate(getLinks); });
3. casper.done()已经过时啦
在casper.run()的回调里你用了casper.done(),这个方法在新版本的CasperJS里已经被弃用了,换成this.exit()来退出脚本就好,甚至你不手动退出也没关系,因为run的回调执行完后CasperJS会自动终止。
4. 数组遍历方式不够安全
你用for(var i in links)遍历数组,这种方式可能会把数组原型上的额外属性也遍历出来,换成forEach或者普通for循环更稳妥,比如:
links.forEach(function(link) { console.log(link); });
修复后的完整代码
var casper = require('casper').create(); var links; function getLinks() { // 替换为你检查到的有效选择器 var links = document.querySelectorAll('.navbar-nav li a'); return Array.prototype.map.call(links, function (e) { return e.getAttribute('href'); }); } casper.start('https://casperjs.org/'); // 等待导航元素加载完成再爬取 casper.waitForSelector('.navbar-nav li a', function() { links = this.evaluate(getLinks); }); casper.run(function () { links.forEach(function(link) { console.log(link); }); this.exit(); });
内容的提问来源于stack exchange,提问作者joung-joon lee
相关产品推荐
相关产品推荐

