使用 Node.js 进行网页抓取

我正在尝试通过网络抓取来完成这项任务。在我的网页上,我获取 URL 并查找其标签之间的内容<body>。然后,我想输出在我的网页上找到的内容。我了解到我可以使用request模块来达到此目的。

问题是,我无法在页面的 HTML 中显示结果,因为我无法保存 的request工作结果(在 POST 部分)

这是我的代码:

var request = require("request");

const express = require('express');

const app = express();

const session = require('express-session');

const path = require('path');

const bodyParser = require('body-parser');

const router = express.Router();

app.use(session({secret: 'shhhhhhh', saveUninitialized: true, resave: true}));

app.use(bodyParser.urlencoded({extended: true}));

var sess;


router.get('/', (req, res) => {

    res.sendFile(path.join(__dirname + '/index.html'));

    sess = req.session;

    if (app.get('done') === true) {

        console.log(app.get('info'));                    // prints "undefined"

        app.set('done', false);


        res.end(`

            <h1>Show other sites</h1>

            <form action="/" method="POST">

                <input type="text" name="site" id="site" placeholder="url"><br>

                <button type="submit">go</button>

                <a href="/">BACK</a>

            </form><br>

            <hr>

            <p>url: ${app.get('site')}</p>

            <hr>

            <div>

            ${app.get('info')}

            </div>

        `);

    }

    else

        res.sendFile(path.join(__dirname + '/index.html'));

})

router.post('/', (req, res) => {

    sess = req.session;

    sess.site = req.body.site;

    

    app.set('done', false);

    if (sess.site) {

        app.set('done', true);

        request({

            uri: `${sess.site}`,}, function(error, response, body) {

                app.set('info', body);       // Here I'm trying to save the scraped result

                app.set('site', sess.site);

            }

        );

    }

    res.redirect('/');

})

router.get('/clear', (req, res) => {

    req.session.destroy((err) => {

        if (err)

            return console.log(err);

        res.redirect('/');

    })

})

app.use('/', router);


app.listen(3000);

console.log("Running at port 3000");

请帮助我找出我做错了什么以及如何保存Request模块的结果以供以后使用。


慕哥9229398
浏览 39回答 0
0回答

慕盖茨4494581

我不得不说,按照你的逻辑,最好再考虑一下。请记住,使用全局变量是一种不好的做法!有人说您可以通过以下这些微小的更改来解决逻辑安装节点获取npm i node-fetch导入它const fetch = require('node-fetch');然后将POST终点更改为router.post('/', async (req, res) => {    sess = req.session;    sess.site = req.body.site;    app.set('done', false);    if (sess.site) {        app.set('done', true);        await fetch(sess.site)            .then(resp => resp.text()).then(body => {                console.log(body)                app.set('info', body);       //Here I'm trying to save the scrapped result                app.set('site', sess.site);            })    }    res.redirect('/');})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript