我正在尝试制作一个网络爬虫(教育目的),而且我已经走了很远,但是这个小问题困扰着我。
我做了一个请求回调函数,我试图让第 75-78 行工作。但是,要使其正常工作,我需要 PDF_LISTS 和 PDF_LINKS 来初始化为正确的值。
我已经尝试使它们成为全局变量,但由于某些原因,它不起作用。所以我的问题是:如何创建一个回调函数来调用 for 循环(75-78)并成功地将 PDF_LISTS 和 PDF_LINKS 初始化为正确的值?
(别担心,经教授许可,我会将其用于教育内容)。第一次在这里发帖!
// URL_LINKS has the pdf links of the pages
PDF_LINKS = [];
// URL_LIST has the names of the pdf links
PDF_LIST = [];
function fillPDF(callback) {
request(url, function(err, res, body) {
$ = cheerio.load(body);
links = $('a'); //jquery get all hyperlinks
$(links).each(function(i, link) {
var value = $(link).attr('href');
// creates objects to hold the file
if (value.substring(value.length - 3, value.length) == "pdf") {
PDF_LINKS[i] = $(link).attr('href');
PDF_LIST[i] = $(link).text();
}
})
});
}
// must decleare fillPDF variable or else you wont initilze teh variables
fillPDF() {
//HERE I WANT PDF_LINKS and PDF_LIST to be intialized to 33.....
}
for (j = 0; j < PDF_LIST.length; j++) {
request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
}
您可以使用数组的 push 方法将值推送到数组中,从而避免未定义数组的元素。
您可以将最终的 for 循环放入一个函数中,然后使用 fillPDF();
一旦请求结束,您还需要调用 fillPDF 的回调。
PDF_LINKS = [];
PDF_LIST = [];
function fillPDF(callback) {
request(url, function(err, res, body) {
$ = cheerio.load(body);
links = $('a');
$(links).each(function(i, link) {
var value = $(link).attr('href');
if (value.slice(-3) == "pdf") {
PDF_LINKS.push(value);
PDF_LIST.push($(link).text());
}
})
callback();
});
}
function writePDF() {
for (j = 0; j < PDF_LIST.length; j++) {
request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
}
}
fillPDF(writePDF);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句