我正在尝试完成有关网络抓取的任务。在我的网页上,我获取 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
模块的结果以备后用。
答案 0 :(得分:1)
我不得不说,在遵循你的逻辑之后,最好再考虑一下。请记住,使用全局变量是一种不好的做法!
据说
你可以按照这些小改动解决逻辑
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('/');
})