Stack上有几个类似的问题,但我无法得到任何适合我的答案,我对Node和异步编程的想法完全陌生,所以请多多包涵。
我正在构建一个目前有 4 个步骤的刮板:
- 我给它一个链接集合
- 它转到这些链接中的每一个,
img src
在页面上找到所有相关的 - 它找到“下一页”链接,获取它的
href
,从中检索 domhref
并重复步骤 #2。 - 所有这些
img src
都放入一个数组并返回
这是代码。getLinks
可以异步调用,但其中的while
循环目前不能:
function scrape(url, oncomplete) {
console.log("Scrape Function: " + url);
request(url, function(err, resp, body) {
if (err) {
console.log(UHOH);
throw err;
}
var html = cheerio.load(body);
oncomplete(html);
}
);
}
function getLinks(url, prodURL, baseURL, next_select) {
var urls = [];
while(url) {
console.log("GetLinks Indexing: " + url);
var html = scrape(url, function(data) {
$ = data;
$(prodURL).each(function() {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
}
);
next = $(next_select).first().attr('href');
url = next ? baseurl + next : null;
}
);
}
console.log(urls);
return urls;
}
目前,这进入了一个无限循环,没有刮掉任何东西。如果我把url = next ? baseurl + next : null;
回调放在外面,我会得到一个"next" is not defined
错误。
关于如何重新工作以使其对节点友好的任何想法?看起来,就这个问题的本质而言,它需要被阻塞,不是吗?