【发布时间】:2016-09-26 21:59:33
【问题描述】:
这是我尝试重组代码以正确利用 Promise 的尝试。整个程序是一个基本的网络爬虫。
挑战在于尝试确保 lastStep 可以访问每个页面的 HTML 和 URL,因此我尝试在 nextStep() 中返回一个对象。
我正在控制台记录 html,它被正确返回,但由于某种原因,承诺被记录如下:Promise { <pending> }。为什么会发生这种情况,我该如何解决?
谢谢!
//Modules being used:
var cheerio = require('cheerio');
var json2csv = require('json2csv');
var request = require('request');
var moment = require('moment');
var fs = require('fs');
//harcoded url
var url = 'http://shirts4mike.com/';
//url for tshirt pages
var urlSet = new Set();
var remainder;
var tshirtArray = [];
const requestPromise = function(url) {
return new Promise(function(resolve, reject) {
request(url, function(error, response, html) {
if(error) return reject(error);
if(!error && response.statusCode == 200){
return resolve(html);
}
});
});
}
function scrape (url) {
return requestPromise(url)
.then(function(html) {
var $ = cheerio.load(html);
var links = [];
//get all the links
$('a[href*=shirt]').each(function(){
var a = $(this).attr('href');
//add into link array
links.push(url + a);
});
// return array of links
return links;
});
}
function nextStep (arrayOfLinks) {
var promiseArray = [];
for(var i = 0; i < arrayOfLinks.length; i++){
promiseArray.push(requestPromise(arrayOfLinks[i]));
var promises = Promise.all(promiseArray);
console.log(promises);
}
return {arrayOfHtml: promises , arrayOfUrls: arrayOfLinks};
}
function lastStep (obj){
for(var i = 0; i < obj.arrayOfHtml.length; i++){
var $ = cheerio.load(obj.arrayOfHtml[i]);
//if page has a submit it must be a product page
if($('[type=submit]').length !== 0){
//add page to set
urlSet.add(obj.arrayOfUrls[i]);
console.log(obj.arrayOfUrls[i]);
} else if(remainder == undefined) {
//if not a product page, add it to remainder so it another scrape can be performed.
remainder = obj.arrayOfUrls[i];
console.log("remainder: " + remainder);
}
}
}
scrape(url)
.then(nextStep)
.then(lastStep)
.catch(function(err) {
// handle any error from any request here
console.log(err);
});
【问题讨论】:
-
如果没有错误,但
response.statusCode不是200会怎样? -
不,现在没有错误。如果我输入
if(error){ console.log(response.statusCode); return reject(error);},我仍然没有在控制台中得到任何不同。 -
@bloppit 这不是问题。如果存在not 错误且
response.statusCodenot 等于200怎么办?例如,想象一下response.statusCode === 1。然后会发生什么? -
对不起,迈克,我不听。如果我 console.log 输入我的 requestPromise,我会一直得到 200 的回报
-
@bloppit 假装
error = false。也假装response.statusCode = 1,好吗?如果您愿意,您甚至可以在request回调的顶部编写该代码。发生什么了?你有没有打电话给reject或resolve?
标签: javascript node.js web-scraping promise