gpt4 book ai didi

javascript - 尝试使用 casperjs 迭代一些链接

转载 作者:行者123 更新时间:2023-11-29 21:45:57 25 4
gpt4 key购买 nike

这是我目前拥有的:

var casper = require('casper').create();

var fs = require('fs');
var folderName = 'CARD_DATA';
var fileName = 'allChampionDecks.txt';
var save = fs.pathJoin(fs.workingDirectory, folderName, fileName);

// init jquery
var casper = require('casper').create({
clientScripts: ['jquery.min.js']
});

casper.start(URL, function() {

});

var links = ["http://magic.wizards.com/en/events/coverage/mtgochamp14","http://magic.wizards.com/node/335986","http://magic.wizards.com/en/events/coverage/2014WC"];
var i = -1;
var linkData = '';

// iterate
casper.then(function() {
this.each(links, function() {
i++;
this.thenOpen((links[i]), function() {
linkData += this.evaluate(getLinkDeckData);
});
});

fs.write(save, linkData + '\n', 'w');
});

// scrape
function getLinkDeckData() {
var meta = $('.deck-meta h4');
var event = $('.deck-meta h5');
var allDecks = $('.toggle-text .deck-list-text');
var json = '{';

for(var i = 0; i < meta.length; i++) {
json += '"event": "'+$(event[i]).text().trim()+'",'
+'"deckName": "'+$(meta[i]).text()+'",'
+'"deck": [';

var cardCount = $(allDecks[i]).find('.sorted-by-overview-container .row .card-count');
var cardName = $(allDecks[i]).find('.sorted-by-overview-container .row .card-name');

for(var j = 0; j < cardCount.length; j++) {
if(j < cardCount.length-1)
json += '{"quantity":"'+$(cardCount[j]).text()+'", "name":"'+$(cardName[j]).text()+'"},';
else
json += '{"quantity":"'+$(cardCount[j]).text()+'", "name":"'+$(cardName[j]).text()+'"}';
}

json += '],'
+'"sideboard": [';

var cardCount = $(allDecks[i]).find('.sorted-by-sideboard-container .row .card-count');
var cardName = $(allDecks[i]).find('.sorted-by-sideboard-container .row .card-name');

for(var j = 0; j < cardCount.length; j++) {
if(j < cardCount.length-1)
json += '{"quantity":"'+$(cardCount[j]).text()+'", "name":"'+$(cardName[j]).text()+'"},';
else
json += '{"quantity":"'+$(cardCount[j]).text()+'", "name":"'+$(cardName[j]).text()+'"}';
}

if(i < meta.length-1)
json += '],'
else
json += ']}'
/**/
}

return json;
}

casper.run();

我正在尝试遍历某些链接以抓取一些数据。我没有收到任何错误,但是 linkData 是空的,没有任何内容写入文件。

对于单个页面,我使用了以下内容并且效果很好:

casper.start(URL, function() {
var data = this.evaluate(getLinkDeckData);

fs.write(save, data + '\n', 'w');
});

最佳答案

所有then*(和wait*)函数都是异步步骤函数。当你创建一个循环并在循环内调用 casper.thenOpen() 时,你会安排一个打开步骤,并附带一个 then 回调作为一个单独的步骤。

问题是当您尝试编写 linkData 时,它不是在单独的步骤中。只需将其包装在 casper.then() 中即可。

固定片段:

casper.then(function() {
links.forEach(links, function(link, i) {
this.thenOpen(link, function() {
linkData += this.evaluate(getLinkDeckData);
});
});

this.then(function(){
fs.write(save, linkData + '\n', 'w');
});
});

您应该使用 Array.prototype.forEach,而不是使用 CasperJS 的 each。这样,您就不需要全局计数器变量。

关于javascript - 尝试使用 casperjs 迭代一些链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com