gpt4 book ai didi

javascript - 抓取链接,存储在数组中,然后在 CasperJS 中运行另一个进程

转载 作者:行者123 更新时间:2023-11-30 17:00:01 25 4
gpt4 key购买 nike

我目前有两个 CasperJS 脚本,出于可用性目的,我想将它们合并为一个。 test1.js 抓取网页链接(<a> 元素)。所有抓取的结果链接都存储在一个数组中 urls .脚本 test2.js 需要一个 link并从 iframe 中提取 youtube src 链接。

如何收集所有链接 (test1.js),然后访问每个链接以提取 youtube链接(test2.js),最后将YouTube链接存储在数组中并显示结果?

test1.js

var urls = [];
var casper = require('casper').create();
function getNumberOfItems(casper) {
return casper.getElementsInfo(".listview .badge-grid-item").length;
}

function tryAndScroll(casper) {
casper.page.scrollPosition = { top: casper.page.scrollPosition["top"] + 4000, left: 0 };
var info = casper.getElementInfo('.badge-post-grid-load-more');
if (info.visible) {
var curItems = getNumberOfItems(casper);
if( curItems <= 60 ) {
casper.waitFor(function check(){
return curItems != getNumberOfItems(casper);
}, function then(){
tryAndScroll(this);
}, function onTimeout(){
this.echo("Timout reached");
}, 20000);
}
} else {
casper.echo("no more items");
}

}

casper.start('http://example.com', function() {
tryAndScroll(this);
});

casper.then(function() {
casper.each(this.getElementsInfo('.title'), function(casper, element, j) {
var url = element["attributes"]["href"];
urls.push(url);
});
});

casper.run(function() {
this.echo(urls.join('\n')).exit();
this.echo(urls.length + ' links found');
});

test2.js(目前只取一个url)

var casper = require('casper').create();
var yt_links = [];

casper.start('http://example.com', function() {
this.click('.responsivewrapper');
});

casper.then(function() {
casper.each(this.getElementsInfo('.badge-youtube-player'), function(casper, element, j) {
var url = element["attributes"]["src"];
yt_links.push(url);
});
});

casper.run(function() {
this.echo(yt_links.join('\n')).exit();
this.echo(yt_links.length + ' link(s) found');
});

最佳答案

CasperJS的

startrun函数只能使用一次,但也有thenOpen函数一步打开一个URL .所有 then*wait* 函数都是单步函数。通过调用它们,您基本上可以安排这些函数所代表的步骤。此外,您可以嵌套 CasperJS 步骤。因此,只有在所有嵌套步骤完成后,脚本中更靠下但树中更高的步骤才会执行。

// last step of test1.js
casper.then(function() {
this.getElementsInfo('.title').forEach(function(element) {
// skip elements that don't have a href attribute...
if (!element.attributes.href) {
return;
}
// here come the contents of test2.js
casper.thenOpen(element.attributes.href, function() {
this.click('.responsivewrapper');
}).then(function(){
...
}).then(function(){
this.echo(yt_links.join('\n')).exit();
this.echo(yt_links.length + ' link(s) found');
});
});
});

我使用构建器/promise 模式使代码示例更短一些。

关于javascript - 抓取链接,存储在数组中,然后在 CasperJS 中运行另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065230/

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