Как очистить данные выборки с нескольких страниц и отобразить на одной странице с помощью Puppeteer и Cheerio?

#node.js #puppeteer #cheerio

#node.js #puppeteer #cheerio

Вопрос:

Я пытаюсь очистить данные с двух разных веб-страниц и отобразить / сравнить на своей собственной странице. Он отлично работает для отображения данных с одного веб-сайта и разбивается, когда я добавляю другой URL.(ну, по-прежнему отображать информацию, полученную с 1-го веб-сайта, но оставить пустым для 2-го) итак, как написать код для получения данных с нескольких веб-сайтов? вот код

 //modules for express, path, ejs, puppeteer, cheerio

//steup const
const express = require('express');
const app = express();
const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
const path = require('path')

let browser;
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

//async getData
async function getData(url, page){
    try{
       await page.goto(url, {waitUnitl : 'load', timeout : 0})
       const html = await page.evaluate( () => document.body.innerHTML);
       const $ = cheerio.load(html);
       let text1 = $("#feature-bullets > ul > li:nth-child(6) > span").text();
       let text2 = $("#feature-bullets > ul > li:nth-child(8) > span").text();
       let text3 = $("#feature-bullets > ul > li:nth-child(10) > span").text();
       let text4 = $("#feature-bullets > ul > li:nth-child(9) > span").text();
       let img = $("#landingImage").attr("src");
       let aprice = $("#priceblock_dealprice").text();
       let aunit = $("#variation_style_name > div > span > span.a-truncate-cut > span").text();
       let ashipping = $("#deliveryMessageMirId > b").text();
       let awarranty = $("#creturns-policy-anchor-text").text();
       let eprice = $("#a-autoid-10-announce > span.a-color-base > span").text();
       return{text1, text2, text3, text4, aprice, aunit, ashipping, awarranty, img, eprice}
    }
    catch(error){
      console.log(error);
    }
}

//routes
app.get('/results', async function(req, res){
    browser = await puppeteer.launch({headless : true})
    const page = await browser.newPage();
    //calling the getData function and sending URL and the page
    let data = await getData('https://www.amazon.com/TP-Link-Deco-Whole-Home-System/dp/B06WVCB862/ref=sr_1_3?dchild=1amp;keywords=mesh wifi systemamp;qid=1606836634amp;sr=8-3', page, 'https://www.amazon.com/gp/product/1616770813/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8amp;psc=1', page );
    res.render('results', {data : data});
})

//server
app.listen(3000, ()=>{
    console.log('server running');
})
----
 

Надеюсь, я задаю правильный вопрос, это самый первый вопрос, который я задал здесь. Я только начинаю учиться node.js так что у меня пока не так много знаний. Большое спасибо

Ответ №1:

Вам нужно изменить вызов getData функции, вы не можете передать 4 параметра, когда он принимает только 2 одновременно.

Итак, вы можете решить эту проблему, разделив вызовы на две страницы следующим образом:

 let data1 = await getData('https://www.amazon.com/TP-Link-Deco-Whole-Home-System/dp/B06WVCB862/ref=sr_1_3?dchild=1amp;keywords=mesh wifi systemamp;qid=1606836634amp;sr=8-3', page);
let data2 = await getData('https://www.amazon.com/gp/product/1616770813/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8amp;psc=1', page );
let data = [data1, data2]
res.render('results', {data})
 

Комментарии:

1. это хорошая идея объединить URL-адрес вместе, в журнале консоли нет ошибок, но я не знаю, почему на моей индексной странице не отображаются данные, либо data1, либо data2, только HTML-фрейм ejs. Я пытаюсь разобраться сейчас, в любом случае, я ценю ваше предложение.