是否可以使用HTML文本字段中的Scrapy处理POST请求



这是我第一次必须创建一个大项目,现在我陷入了困境。我的目标是创建一个用户必须搜索食谱的网站,这意味着他在文本字段中插入一个字符串,然后单击按钮,我必须在同一HTML中显示一个食谱列表(取自我可以选择的3个网站(,该列表基于网站中的文本和用户插入的字符串之间的相似性,使用Scrapy和Solr。我创建了一个简单的main.html文件:

<!DOCTYPE html>
<script src="../index.js"></script>
<link rel="stylesheet" href="style.css">
<html>
<body>
<h1> Recipes founder</h1>
<form class="example" method="post" action="query">
<input id ="query" type="text" placeholder="Insert a recipe.." name="search" 
value="">
<button id="searchRecipe" type="submit"><i></i>Search</button>
</form>
</body>
</html>

服务器启动,显示HTML文件的get请求在index.js文件中:

//require framework and middleware dependencies
const express = require('express');
const path = require('path');
const logger = require('morgan');
const methodOverride = require('method-override');
const fileUpload = require('express-fileupload');
const fs = require('fs-extra');

//init framework
const app = express();
app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 }, safeFileNames: true,                                                 
preserveExtension: 4, debug: false
}));
app.use(express.urlencoded({ extended: false }));
app.use(express.json({limit: '4MB'}));    // parse application/json
app.use(methodOverride('_method'));

// Request

//Visualize HTML and CSS 
app.get("/", function (request, response){
//show this file when the "/" is requested
response.sendFile(path.join(__dirname, 'public', 'main.html'));
});

// Not correct -> must use Scrapy
//app.post("/query", function(request, response) {
//manda a scrapy? Scrapy prende js con selenium
//})

//default fallback handlers
// catch 404 and forward to error handler
app.use(function(req, res, next) {
const err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.json({
message: err.message,
error: err
});
});

//start server
app.set('port', 8000);
const server = app.listen(app.get('port'), function() {
console.log('Express server listening on port ' + server.address().port);
});

这部分有效。现在我的问题是,我对如何处理用户的POST请求有点困惑。我必须使用Scrapy而不是JavaScript来处理它,因为Scrapy必须获取用户字符串,即我提供给它的网页中的文本,并检查它们之间的相似性,但我不知道我以这种方式设置项目是否错误,或者Scrapy真的有可能以这种方式管理请求。我读到Selenium用于允许JS和Scrapy之间的通信,但我不知道它是否对我的问题有用。

是的,可以使用Scrapy进行Post Request,通常这是使用FormRequest完成的,对于您的用例来说应该足够了。

是的,还可以将Selenium与Scrapy一起用于处理JavaScript页面。硒还有其他的替代品,比如Pyppeteer和Playwright。

然而,如果你能避免它,你应该选择普通的Scrapy,因为它更快,从长远来看可能会让你省去很多头痛,因为可能出现错误的来源更少。

最新更新