#javascript #node.js #express #web-scraping #puppeteer
Вопрос:
если я запускаю этот код на своей локальной машине, он работает, но после развертывания на сервере он больше не работает
var express = require('express'); var app = express(); const puppeteer = require('puppeteer'); app.get('/scrape', function (req, res) { const url = req.query.url; const preparePageForTests = async (page) =gt; { // Pass the User-Agent Test. const userAgent = 'Mozilla/5.0 (X11; Linux x86_64)' 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36'; await page.setUserAgent(userAgent); }; (async () =gt; { const browser = await puppeteer.launch({ args: ['--no-sandbox'], }); const page = await browser.newPage(); // await page.setViewport({ width: 1280, height: 720 }); await preparePageForTests(page); await page.setRequestInterception(true); page.on('request', (req) =gt; { if (req.resourceType() == 'stylesheet' || req.resourceType() == 'font') { req.abort(); } else { req.continue(); } }); await page.goto(url, { waitUntil: 'load' }); if (url.includes('tokopedia')) { data = await page.evaluate(() =gt; { const product = document.querySelector('h1.css-1wtrxts').textContent; const price = document.querySelector('.price'); const img = document.querySelector('.css-1b60o1a img'); const dataObj = { product, price, img, }; return dataObj; }); } else if (url.includes('shopee')) { data = await page.evaluate(() =gt; { const product = document.querySelector('div.attM6y gt; span').textContent; const price = document.querySelector('div.Ybrg9j').textContent; const img = null; const dataObj = { product, price, img, }; return dataObj; }); } else if (url.includes('blibli')) { await page.waitForSelector('div.product-info__main gt; div.product-name'); data = await page.evaluate(() =gt; { const product = document.querySelector( 'div.product-info__main gt; div.product-name' ).textContent; const price = document.querySelector( 'div.final-price gt; span' ).textContent; const img = null; const dataObj = { product, price, img, }; return dataObj; }); } else { // await page.waitForSelector('div.pdp-mod-product-badge-title'); data = await page.evaluate(() =gt; { const product = 'null'; const price = 'asd'; const img = null; const dataObj = { product, price, img, }; return dataObj; }); } console.log(data); res.json(data); await browser.close(); })(); }); const port = 3000; app.listen(port, () =gt; { console.log(`Server running at http://localhost:${port}`); }); exports = module.exports = app;
если я буду работать на местном:
http://127.0.0.1:3000/scrape?url=https://www.tokopedia.com/collinsofficial/acer-aspire-3-slim-a314-22-amd-ryzen-3-3250u-4gb-256gb-14-fhd-w10-ohs-hd-1366x768?utm_source=Androidamp;utm_source=Androidamp;utm_medium=Shareamp;utm_medium=Shareamp;utm_campaign=Product Shareamp;utm_campaign=Product Shareamp;_branch_match_id=978964305966617172
это даст жатву:
{ "product": "Acer Aspire 3 Slim A314-22 AMD RYZEN 3-3250U 4GB 256GB 14" FHD W10 OHS - HD (1366x768)", "price": "Rp6.999.000", "img": "https://images.tokopedia.net/img/cache/500- square/VqbcmM/2021/11/10/8feb4ee0-1fb1-49fc-876e-71a0bbda732f.jpg.webp?ect=4g" }
но я развертываю в ubuntu server 18.04, это не работает, учитывая ошибку:
/var/www/html/scrapejs/node_modules/кукловод/lib/cjs/кукловод/общий/ExecutionContext.js:221 выдать новую ошибку(«Ошибка оценки:» helper_js_1.helper.getExceptionMessage(исключение)); ^
Ошибка: не удалось оценка: ошибку TypeError: не удается прочитать свойства значение null (значение ‘текстового содержимого’) на puppeteer_evaluation_script:4:57 в параллельном режиме._evaluateInternal (файле/var/www в/HTML-код/scrapejs/папки node_modules/кукловод/Либ/КВН/кукловод/общие/параллельном режиме.в JS:221:19) в асинхронных параллельном режиме.оценить (в/var/www в/HTML-код/scrapejs/папки node_modules/кукловод/Либ/КВН/кукловод/общие/параллельном режиме.в JS:110:16) в асинхронных файле /var/www в/HTML-код/scrapejs/приложения.в JS:43:14
Надеюсь, я смогу найти решение, что я могу для этого сделать?