Я создаю скребок для контента для веб-сайта tshirt.
Цель состоит в том, чтобы ввести веб-сайт только с одним жестко запрограммированным URL: http://shirts4mike.com
Затем я найду все страницы продуктов для каждой футболки, а затем создаю объект с его деталями. Затем добавьте его в массив.
Когда массив заполнен tshirts, я буду работать через массив и зарегистрировать его в CSV файле.
В настоящее время у меня возникают проблемы с временем запросов/ответов и вызовами функций.
Как я могу убедиться, что я вызываю функцию NEXT в нужное время? Я понимаю, что он не работает из-за его асинхронного характера.
Как я могу вызвать secondScrape, lastScraper и convertJson2Csv в нужное время, чтобы переменные, с которыми они работают, не были undefined?
Я пытался использовать что-то вроде response.end(), но это не работает.
Я предполагаю, что мне нужно использовать promises для правильной работы? и быть разборчивым?
Любые идеи? Мой код ниже:
//Modules being used:
var cheerio = require('cheerio');
var request = require('request');
var moment = require('moment');
//hardcoded url
var url = 'http://shirts4mike.com/';
//url for tshirt pages
var urlSet = new Set();
var remainder;
var tshirtArray;
// Load front page of shirts4mike
request(url, function(error, response, html) {
    if(!error && response.statusCode == 200){
        var $ = cheerio.load(html);
    //iterate over links with 'shirt'
        $("a[href*=shirt]").each(function(){
            var a = $(this).attr('href');
            //create new link
            var scrapeLink = url + a;
            //for each new link, go in and find out if there is a submit button. 
            //If there, add it to the set
            request(scrapeLink, function(error,response, html){
                if(!error && response.statusCode == 200) {
                    var $ = cheerio.load(html);
                    //if page has a submit it must be a product page
                    if($('[type=submit]').length !== 0){
                        //add page to set
                        urlSet.add(scrapeLink);
                    } else if(remainder === undefined) {
                        //if not a product page, add it to remainder so it another scrape can be performed.
                        remainder = scrapeLink;                     
                    }
                }
            });
        });     
    }
    //call second scrape for remainder
    secondScrape();
});
function secondScrape() {
    request(remainder, function(error, response, html) {
        if(!error && response.statusCode == 200){
            var $ = cheerio.load(html);
            $("a[href*=shirt]").each(function(){
                var a = $(this).attr('href');
                //create new link
                var scrapeLink = url + a;
                request(scrapeLink, function(error,response, html){
                    if(!error && response.statusCode == 200){
                        var $ = cheerio.load(html);
                        //collect remaining product pages and add to set
                        if($('[type=submit]').length !== 0){
                            urlSet.add(scrapeLink);
                        }
                    }
                });
            });     
        }
    });
    console.log(urlSet);
    //call lastScraper so we can grab data from the set (product pages)
    lastScraper();
};
function lastScraper(){
    //scrape set, product pages
    for(var i = 0; i < urlSet.length; i++){
        var url = urlSet[i];
        request(url, function(error, response, html){
            if(!error && response.statusCode == 200){
                var $ = cheerio.load(html);
                //grab data and store as variables
                var price = $('.price').text();
                var img = $('.shirt-picture').find("img").attr("src");
                var title = $('body').find(".shirt-details > h1").text().slice(4);
                var tshirtObject = {};
                //add values into tshirt object
                tshirtObject.price = price;
                tshirtObject.img = img;
                tshirtObject.title = title;
                tshirtObject.url = url;
                tshirtObject.date = moment().format('MMMM Do YYYY, h:mm:ss a');
                //add the object into the array of tshirts
                tshirtArray.push(tshirtObject); 
            }
        });
    }
    //call function to iterate through tshirt objects in array in order to convert to JSON, then into CSV to be logged
    convertJson2Csv();
};
