我正在尝试使用CasperJS来抓取一个拥有动态内容并且到目前为止失败的网站.该网站使用几个js库(例如Prototype)来使用自动完成来创建内容.因此,我试图插入一些值并触发事件以引发内容创建.插入和触发事件可以正常工作,但不会创建任何内容.
我是CasperJS的新手,发现它与库的相对路径有问题.我怀疑我的问题来自于在我的页面环境中没有正确加载的库.因此我试着injectJs像这样注射它们
// ...创建casper并做一些其他的事情
casper.then(function(){
Run Code Online (Sandbox Code Playgroud)this.echo(this.page.injectJs('http://www.my-website.com/path/to/js1')); this.echo(this.page.injectJs('http://www.my-website.com/path/to/js2')); });
不幸的是,这两个函数都返回false.脚本的路径是正确的,在哪里可能是这个问题的根源?
非常感谢您的帮助.
我正在使用PhantomJS截取网页截图.
我见过有关@ font-face问题的其他帖子,但我网页上的字体正确呈现.我遇到的唯一问题是,每次拍摄屏幕截图时,字体显示与上一屏幕截图略有不同.因此,虽然它们正确呈现,但它们在屏幕截图上的外观不一致.
我已经尝试了一些修复程序,大多数都基于这样的假设,即它与在页面准备好之前拍摄的屏幕截图有关,但这似乎不是问题.例如,我已经延迟了截取的截图,以便字体有时间加载和渲染,但这并不能解决问题.
我已尝试绑定到各种页面事件,但再次,没有运气.
我附上了截图以显示差异.问题是,我需要渲染的截图在我使用它的上下文中是准确的.

作为一个注释,我也尝试过CasperJS(知道它是基于PhantomJS所以不要期望它有任何不同).
PHP使用exec()命令调用CasperJS .在CasperJS完成其工作(例如检索网页的某些部分)之后,如何将检索到的数据返回给PHP?
我们知道我们可以在CasperJS中中止资源请求,如下所示:
casper.on('page.resource.requested', function(requestData, request) {
if(/plusone|google\.com|about:blank/.test(requestData.url)){
this.echo("----I can ignore this------");
request.abort();
}
});
Run Code Online (Sandbox Code Playgroud)
但是我发现它太慢了(打开一个页面可能需要几个小时),因为导航请求太多了,其中大多数是类型Reload,我想要这样的东西:
casper.on('navigation.requested', function(url, navigationType, navigationLocked, isMainFrame) {
utils.dump(arguments);
if(/plusone|google\.com|about:blank/.test(url)){
this.echo("!!!-----------------------------Can I abort the request?---------------------!!!");
// request.abort();
}
});
Run Code Online (Sandbox Code Playgroud)
我在谷歌搜索了一整天,什么也没得到.这让我崩溃了.
我正在尝试使用Casperjs从页面获取链接列表,然后打开每个链接,并从这些页面向数组对象添加特定类型的数据.
我遇到的问题是在每个列表项上执行的循环.
首先,我listOfLinks从原始页面获得了一个.这部分工作和使用长度我可以检查这个列表是否已填充.
但是,使用如下的循环语句this.each,没有任何控制台语句出现,并且casperjs似乎跳过此块.
this.each用标准for循环替换,执行只在第一个链接的一部分,因为语句"在对象中为x.html创建新数组"出现一次,然后代码停止执行.使用IIFE不会改变这种情况.
编辑:在详细调试模式下,会发生以下情况:
Creating new array object for https://example.com
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true
Run Code Online (Sandbox Code Playgroud)
因此,由于某种原因,传递给thenOpen函数的URL变为空白...
我觉得有一些关于Casperjs的异步性质的东西,我在这里并没有把握,并且很感激被指向一个有效的例子.
casper.then(function () {
var date = Date.now();
console.log(date);
var object = {};
object[date] = {}; // new object for date
var listOfLinks = this.evaluate(function(){
console.log("getting links");
return document.getElementsByClassName('importantLink');
});
console.log(listOfLinks.length);
this.each(listOfLinks, function(self, link) {
var eachPageHref = link.href;
console.log("Creating new array in object for " + eachPageHref);
object[date][eachPageHref] = []; // array …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CasperJS作为网络抓取工具,并且有一个页面包含按钮,点击时会加载数据.所以,我想首先点击所有这些按钮,然后在实际进行查询之前等待以获取所有必要的数据.
问题是,使用Casper,casper.thenClick(selector)单击第一个元素.但是,如何基于选择器迭代并单击每个元素?
请注意,这些按钮没有ID.它们都有通用的类选择器.
防爆.
<h3>
<span>Text 1</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 2</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 3</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
Run Code Online (Sandbox Code Playgroud)
由于某种原因casper.thenClick("h3:contains('text 1') .load-btn")不起作用.
这是我第一次使用无头浏览器打开网站:phantomjs,slimerjs或casperjs.我只想打开网站.我只是创建非常基本的脚本来打开网站并截取屏幕截图.但其中3个(三个)给我空白图片.
我尝试使用:
--debug=true
--ssl-protocol=TLSv1.2 (i try each of available protocol)
--ignore-ssl-errors=true
Run Code Online (Sandbox Code Playgroud)
我的脚本在这里:
Slimerjs
var page = require("webpage").create();
page.open("https://domain/")
.then(function(status){
if (status == "success") {
page.viewportSize = { width:1024, height:768 };
page.render('screenshot.png');
}
else {
console.log("Sorry, the page is not loaded");
}
page.close();
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
phantomjs
var page = require('webpage').create();
page.open('https://domain/', function() {
page.render('screenshot.png');
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
casperjs
var casper = require('casper').create({
viewportSize: {width: 950, height: 950}
});
casper.start('https://domain/', function() {
this.capture('screenshot.png');
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用屏幕捕获服务来了解它们是否可以打开.但是他们所有人都没有给我任何东西.
我有什么想念吗?
我试图让CasperJS打开链接中的每个array链接.我有它,以便在我打开链接后,它将显示该页面的标题.然而,当我运行它时,没有显示任何内容.
我可以用a for loop来显示链接,它完美无缺.
这是我刚才解释的代码:
var x;
casper.start(URL, function() {
x = links.split(" "); // now x is an array of links
for (var i = 0; j < x.length; i++) // for every link...
{
casper.thenOpen(partialURL + x[i], function() { // open that link
console.log(this.getTitle() + '\n'); // display the title of page
});
}
this.exit();
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
这是我尝试的另一种方法:
var x;
casper.start(URL, function() {
x = links.split(" "); // now x is an array of links …Run Code Online (Sandbox Code Playgroud) 昨天我用CasperJS编写了我的第一个测试,我发现它很棒.问题是我找不到退出脚本执行的方法(即:casperjs不存在,所以我可以返回访问我的控制台).我通过添加最终测试找到了一种解决方法
casper.test.begin('Exit', function suite(test) {
casper.exit();
});
Run Code Online (Sandbox Code Playgroud)
关于这种技术,我有2个问题
我试图运行CasperJS有PhantomJS#2.0.0一对MAC(优胜美地).当尝试运行CasperJS时,我收到以下消息:
"CasperJS needs PhantomJS v1.x
/usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/bootstrap.js:91 in __die"
Run Code Online (Sandbox Code Playgroud)
我该如何让它运行?有没有人让它工作?
casperjs ×10
phantomjs ×9
javascript ×5
web-scraping ×3
automation ×1
click ×1
font-face ×1
html ×1
php ×1
request ×1
slimerjs ×1