#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. Я пытаюсь разобраться сейчас, в любом случае, я ценю ваше предложение.