刮擦:在cheerio的.each()//回调问题中嵌套的http请求

时间:2017-06-29 09:22:58

标签: javascript node.js web-scraping cheerio node-request

我正在尝试抓取我的旧静态网站,以便从数据中创建一个可用的json。

我有一个包含产品列表的页面(div = class ='product')。

我想我错过了嵌套请求的回调,因为我遇到了着名的JS Gotcha循环。

此处提供完整代码:https://pastebin.com/9jZTmtRr

1)从根页面收集一些常规信息并将其放在一个对象中:

request(url, (err, resp, body) => {
    let $ = cheerio.load(body)

    let result = {
        name: $('.card-container > h2').text(),
        slogan: $('.card-container > h4').text(),
        img: 'insert image',
        short: 'insert short',
        long: $('.card-container > p').text()
    }

2)然后对于每个产品,打开它的链接(嵌套请求?)并提取更多信息:

    $('.product_description').each(function(index, element) {
        let formattedName = $('a', this).text().replace('+', '').replace(' ', '').toLowerCase()

        let tempObject = {
            name: $('a', this).text(),
            short: $('p', this).text(),
        }

        // Following part is where my problem lies

        let productURL = baseURL + $('a', this).attr('href')

        request(productURL, function (err, resp, html) {
            let productBODY = cheerio.load(html)

            return tempObject.slogan = productBODY('.product_detailed > h2').text()
        })

        // This is working fine
        return result[formattedName] = tempObject
    })

3)输出到文件:

    return fs.writeFile('output.js', JSON.stringify(result, null, 4), err => err ? console.log(err) : console.log('done'))
})

0 个答案:

没有答案