Рекурсивный вызов функции JavaScript на основе обещаний для веб-скребка для проверки следующих страниц. - PullRequest
0 голосов
/ 21 января 2019

Я строю веб-скребок Ebay как побочный проект, и мне нужно знать, как многократно вызывать функцию, основанную на обещаниях, чтобы получить все товары продавца на нескольких страницах, пока я не достигну конца его товаров.

В основном, используя Javascript и Node.js, если у продавца есть только 1 страница товаров, я очищаю его, и все в порядке.

Для меня все становится сложнее, когда у него несколько страниц, и мне нужновызывать функцию обещания несколько раз и возвращать ссылки на каждую страницу.Я пробовал циклы обещаний, пробовал рекурсию и пробовал async / await.Кажется, ничего не работает.

Я включу фрагмент кода для вас, ребята:

const request = require('request-promise');
const cheerio = require('cheerio');

const options = {
    url : 'https://www.ebay.com/sch/i.html?_nkw=&_in_kw=1&_ex_kw=&_sacat=0&_udlo=&_udhi=&_ftrt=901&_ftrv=1&_sabdlo=&_sabdhi=&_samilow=&_samihi=&_sadis=15&_stpos=29582&_sargn=-1%26saslc%3D1&_salic=1&_fss=1&_fsradio=%26LH_SpecificSeller%3D1&_saslop=1&_sasl=brickearth&_sop=12&_dmd=1&_ipg=50&_fosrp=1',
    //url : 'https://www.ebay.com/sch/i.html?_nkw=&_in_kw=1&_ex_kw=&_sacat=0&_udlo=&_udhi=&_ftrt=901&_ftrv=1&_sabdlo=&_sabdhi=&_samilow=&_samihi=&_sadis=15&_stpos=29582&_sargn=-1%26saslc%3D1&_salic=1&_fss=1&_fsradio=%26LH_SpecificSeller%3D1&_saslop=1&_sasl=supersavingsdeals&_sop=12&_dmd=1&_ipg=200&_fosrp=1',
    method : 'GET',
    headers : {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }
}

const pageLinks = [];

async function getPagesRecursive(link) {
    await request(link, (error, response, html) => {
        if(!error && response.statusCode === 200) {
            const $ = cheerio.load(html);
            const nextPage = $('td.pagn-next > a').attr('href');
            pageLinks.push(link)
            if(nextPage) {
                return getPagesRecursive(nextPage);
            }
            console.log(pageLinks);
        }
    })
}

Я почти уверен, что это ничего для вас, эксперты Javascript и Node.js;) У меня естьотправил его вам с помощью async / await, но я хотел бы использовать обещания с модулем запроса, так как я чувствую, что знаю их лучше и лично, я безуспешно пробовал любой другой способ :)

У меня естьесли вам, ребята, два URL-адреса, которые нужно попробовать в объекте параметров модуля запроса.Первая - это ссылка на продавца с несколькими элементами, и она должна получить все ссылки на странице.Вторая ссылка - это продавец с одной страницей, и он должен получить только одну ссылку этого продавца.

Заранее спасибо;)

1 Ответ

0 голосов
/ 21 января 2019

Поскольку request возвращает обещание, вам не нужно ни использовать обратный вызов, ни синтаксис async await - просто вернуть обещание.

Кроме того, вместо заполнения глобальногоpageLinks массив, будет лучше, если вы создадите массив ссылок, основанный на значениях, которые выполняют обещания.

function getPagesRecursive(link) {
    return request(link).then(html => {
        const $ = cheerio.load(html);
        const nextPage = $('td.pagn-next > a').attr('href');
        return nextPage ? getPagesRecursive(nextPage).then(links => [link, ...links])
                        : [link];
    });
}

// Use:
getPagesRecursive(firstPage).then(links => console.log(links))
                            .catch(err => console.log("request failed", err));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...