Как вернуть значение, используя библиотеку Puppeteer для очистки динамических веб-страниц? - PullRequest
0 голосов
/ 30 марта 2019

Я использую cheerio.js и puppeteer.js, следующие за этим учебным пособием , чтобы попытаться выполнить некоторые базовые операции по поиску в сети. Я не следую в точности как учебник, так как пытаюсь написать его на стороне сервера с идеей, чтобы мой бэкэнд обрабатывал все операции очистки и затем в будущем передавал эти данные во внешний интерфейс.

Как написано сейчас, я получаю

[nodemon] restarting due to changes... [nodemon] starting node server.js Your app is listening on port 8080 [Function]

Похоже, dynamicScraper возвращает [Function], когда я ожидаю, что это будет HTML, как в учебнике?

Основной файл server.js

'use strict';

const express = require('express');
const cors = require('cors');
const app = express();
const cheerio = require('./potusScraper');

app.use(express.json());
app.use(
    cors({
        origin: ['http://localhost:3000']
    })
);

app.get('/', (req, res) => {
    let { scraper, dynamicScraper } = cheerio;
    //dynamicScraper should return html as a string?
    dynamicScraper()
        .then(html => {
            res.send(html);
        })
        .catch(err => {
            console.log(err);
        });
});

app.listen(process.env.PORT || 8080, () => {
    console.log(`Your app is listening on port ${process.env.PORT || 8080}`);
});

файл potusScraper.js

'use strict';

const rp = require('request-promise');
const $ = require('cheerio');
const puppeteer = require('puppeteer');
const url = 'https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States';
const url2 = 'https://www.reddit.com';



const cheerio = {
    scraper: function() {
        return rp(url)
            .then(html => {
                const wikiUrls=[];
                for (let i = 0; i < 45; i++) {
                    wikiUrls.push($('big > a', html)[i].attribs.href);
                }
                return(wikiUrls);
            })
            .catch(err => console.log(err))
    },
    dynamicScraper: function() {
       return puppeteer //doesn't look like this works?
            .launch()
            .then(browser => {
                return browser.newPage();
            })
            .then(page => {
                return page.goto(url2)
                    .then(() => {return page.content});
            })
            .then(html => {
                console.log(html);
                return(html);
            })
            .catch(err => console.log(err));
    }

}

module.exports = cheerio;

1 Ответ

1 голос
/ 30 марта 2019

Вы возвращаете функцию page.content в этой строке кода вместо ее вызова:

            .then(page => {
                return page.goto(url2)
                    .then(() => {return page.content});
            })

Третья строка должна выглядеть следующим образом:

                    .then(() => {return page.content()});

Кроме того, вы можете упростить свой код, используя краткую функцию стрелки:

                    .then(() => page.content());
...