【发布时间】:2015-08-13 04:12:49
【问题描述】:
我正在使用 CasperJS 进行网页抓取,但在抓取下面描述的页面时遇到了一些问题。
页面的html是这样的:
<img id="trigger">
<img id="cur_img_xxx" class="show">
<img id="cur_img_yyy" class="cache">
所有<img> 元素共享相同的尺寸,"#trigger" 位于最顶层。当图像有.show 类时,它将显示在页面上;当它是.cache 类时,它将被下载但隐藏。这样,当用户点击图片时,实际上是触发器,将显示下一张图片,并通过 AJAX 下载新图片。结果html变成:
<img id="trigger">
<img id="cur_img_xxx" class="cache">
<img id="cur_img_yyy" class="show">
<img id="cur_img_zzz" class="cache">
我想这是增加用户体验的好策略,并且有利于避免网页抓取,但我仍然想抓取:P
我在 Web 控制台中尝试了$("#trigger").click(),图像被导航并正确下载。但是,当我尝试使用 CasperJS 模拟此过程时,导航和图像下载都不起作用。请参考代码:
var casper = require ("casper").create({
clientScripts: [
'include/jquery.js'
],
pageSettings: {
loadImages: false, // this won't affect since this will only forbid
loadPlugins: false // inline imgs from loading, but all imgs in this
}, // page are loaded dynamically
verbose: true
});
casper.start("http://www.example.com/1234.html");
casper.then(function () {
console.log("Connected! Current Url = " + this.getCurrentUrl());
});
casper.then(function () {
// findInitialImgs will find imgs that have already been loaded
imgs = this.evaluate(findInitialImgs);
this.waitForSelector("#image_trigger").thenClick("#image_trigger");
var next = this.evaluate(function () {
return $("img[id^='cur_img_']").last().attr("href");
});
console.log(next);
});
casper.run(function () {
this.echo('End').exit();
});
正确地,点击"#trigger" 后,最后一个条目会有所不同,即从<img id="cur_img_yyy"> 变为<img id="cur_img_zzz">。但是,next 仍然持有<img id="cur_img_yyy">。我做错什么了吗?
【问题讨论】:
标签: javascript ajax click casperjs image-loading