ここスタックにはいくつかの同様の質問がありますが、私にとってはうまくいく答えが得られません。私はノードと非同期プログラミングのアイデアにまったく慣れていないので、ご容赦ください。
私は現在4ステップのプロセスを持つスクレーパーを構築しています:
- リンク集をあげます
img src
これらの各リンクに移動し、ページ上の関連するすべてを見つけます- 「次のページ」リンクを見つけて、その
href
を取得し、上記から dom を取得して、href
ステップ #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
エラーが発生します。
ノードフレンドリーにするためにこれを再加工する方法についてのアイデアはありますか? この問題の性質上、ブロックする必要があるようですね。