nestjs项目运行python脚本

书接上回根据景区关键词爬取捷程的景区评论的方法

成功实现了捷程评论的爬虫,现在需要把这个爬虫放到后端nestjs项目中,把它作为一个接口来调用。

首先,在nestjs项目的根目录下创建一个python(随便叫什么名字)文件夹,将python文件放在这个文件夹中。
结构层次如下:

- nest-app
  - src
    - user
      - user.service.ts
  - python
    - spider.py

接下来,要实现在service中调用python,在user.service.ts
首先,通过 require('child_process') 引入 child_process 模块,这个模块用于在项目中执行外部进程。

接着,创建一个 Promise 对象,该 Promise 用于封装 Python 脚本的执行过程,以便进行异步操作。

return new Promise((resolve, reject) => {

使用 spawn 方法创建了一个子进程 pythonProcess,并指定要执行的命令是 python,以及传递给脚本的参数,其中 ../python/spider.py 是 Python 脚本的路径,keyword 是传递给脚本的参数。

const pythonProcess = spawn('python', ['../python/spider.py', keyword]);

这里要注意的是,因为需要给python传递参数,python脚本中要加上下面这段代码来传递参数

import sys
# 获取关键字参数
keyword = sys.argv[1]

pythonProcess.stdout.on('data', ...) 处理子进程的标准输出。每当子进程输出数据时,将数据追加到 result 变量中,这个变量最终将包含 Python 脚本的标准输出内容。

pythonProcess.stderr.on('data', ...) 处理子进程的错误输出。同样,每当子进程输出错误信息时,将其追加到 errorOutput 变量中。

pythonProcess.on('close', ...) 处理子进程的关闭事件。当子进程执行完成后,会触发这个事件。如果进程的退出码是 0,表示执行成功,会调用 resolve 方法并返回 result 变量中的内容,否则,表示执行出错,会调用 reject 方法返回错误信息,其中包括退出码和错误输出信息。

相应的python脚本中也将对应的输出通过print返回

python代码见根据景区关键词爬取捷程的景区评论的方法 - 掘金 (juejin.cn)

下面是service.ts里的完整代码

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'
import { Repository } from 'typeorm';
import { UserEntity } from './entities/user.entity';

@Injectable()
export class UserService {
  // 使用InjectRepository装饰器并引入Repository这样就可以使用typeorm的操作了
  constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: Repository<UserEntity>,
  ) { }
  async runPythonScraper(keyword: string) {
    const { spawn } = require('child_process');
  
    return new Promise((resolve, reject) => {
      const pythonProcess = spawn('python', ['../python/spider.py', keyword]);
      let result = '';
      let errorOutput = ''; // 用于存储错误输出信息
  
      pythonProcess.stdout.on('data', (data) => {
        result += data.toString();
      });
  
      pythonProcess.stderr.on('data', (data) => {
        errorOutput += data.toString();
      });
  
      pythonProcess.on('close', (code) => {
        if (code === 0) {
          console.log('Python脚本成功执行');
          resolve(result); // 成功执行时返回结果
        } else {
          console.error(`Python脚本执行出错,退出码:${code}`);
          console.error(`Python脚本错误输出:${errorOutput}`);
          reject(`Python脚本执行出错,退出码:${code}, 错误输出:${errorOutput}`); // 执行出错时返回错误信息
        }
      });
    });
  }
}

最后,为它写一个POST

@Post('comments')
  async scrapeData(@Body() requestBody: { keyword: string }) {
    const keyword = requestBody.keyword;

    // 在此处调用Python脚本并传递关键字
    const result = await this.userService.runPythonScraper(keyword);
    console.log(result);
    // 将结果发送给前端
    return result;
  }

完工!

接口如下(目前是可以使用的):

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在网页中实现通过按钮运行Python脚本的功能,需要用到以下几个步骤: 1. 编写Python脚本,并将其保存在服务器上。 2. 使用JavaScript编写一个函数,当用户点击按钮时,该函数将向服务器发送请求,并将请求的结果显示在页面上。 3. 在HTML中添加一个按钮元素,并绑定点击事件,使其调用上述JavaScript函数。 下面是一个简单的示例,展示了如何通过按钮运行Python脚本: 1. Python脚本 假设我们有一个名为“hello.py”的Python脚本,其内容如下: ```python print("Hello, World!") ``` 我们将其保存在服务器上的“/usr/local/bin/”目录下。 2. JavaScript函数 我们需要编写一个JavaScript函数,该函数将使用XMLHttpRequest对象向服务器发送POST请求,并将服务器返回的响应显示在页面上。下面是一个示例函数: ```javascript function runPythonScript() { var xhr = new XMLHttpRequest(); xhr.open("POST", "/run_script", true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { document.getElementById("output").innerHTML = xhr.responseText; } }; xhr.send("script=hello.py"); } ``` 该函数中的“/run_script”是服务器上的URL,用于接收POST请求并运行Python脚本。我们还将“Content-type”请求头设置为“application/x-www-form-urlencoded”,以便在请求体中传递数据。 该函数将在发送POST请求时传递一个名为“script”的参数,其值为要运行Python脚本的文件名(在此示例中为“hello.py”)。 当服务器返回响应时,该函数将响应文本设置为具有“output”ID的HTML元素的内容。在此示例中,我们将响应文本显示在一个具有“output”ID的段落元素中。 3. HTML按钮 我们需要在HTML中添加一个按钮元素,并为其添加一个点击事件,以便在用户单击按钮时调用上述JavaScript函数。下面是一个示例按钮: ```html <button onclick="runPythonScript()">Run Python Script</button> ``` 当用户单击按钮时,将调用名为“runPythonScript”的JavaScript函数。 完整的HTML代码如下: ```html <!DOCTYPE html> <html> <head> <title>Run Python Script</title> <script type="text/javascript"> function runPythonScript() { var xhr = new XMLHttpRequest(); xhr.open("POST", "/run_script", true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { document.getElementById("output").innerHTML = xhr.responseText; } }; xhr.send("script=hello.py"); } </script> </head> <body> <button onclick="runPythonScript()">Run Python Script</button> <p id="output"></p> </body> </html> ``` 当用户单击“Run Python Script”按钮时,将向服务器发送POST请求,并将服务器返回的响应显示在具有“output”ID的段落元素中。服务器将读取名为“script”的POST参数,并运行其值指定的Python脚本。在此示例中,我们将运行“hello.py”脚本,并在页面上显示其输出“Hello, World!”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值