簡體   English   中英

Web用Node.js刮

[英]Web scraping with Node.js

我正在嘗試在 web 抓取上完成這項任務。 在我的 web 頁面上,我使用 URL 並找到位於其<body>標記之間的內容。 然后,我想 output 在我的 web 頁面上找到的內容。 我了解到我可以為此目的使用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模塊的結果以供以后使用。

我不得不說,在遵循您的邏輯之后,最好再考慮一下。 請記住,使用全局變量是一種不好的做法!

有人說

您可以通過遵循這些小改動來解決邏輯

安裝節點獲取

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

})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM