使用 Node.js 抓取网页

时间:2020-12-24 16:34:29

标签: javascript 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 模块的结果以备后用。

1 个答案:

答案 0 :(得分:1)

我不得不说,在遵循你的逻辑之后,最好再考虑一下。请记住,使用全局变量是一种不好的做法!

据说

你可以按照这些小改动解决逻辑

安装node-fetch

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('/');

})