python - 如何通过表单提交在 laravel 中运行 python 脚本?
问题描述
我正在尝试运行一个自动化脚本(python-selenium 脚本),该脚本在从客户端获取一些输入后从网站上抓取数据。我正在尝试使用表单发送凭据并处理它,然后使用 shell_exec 或 exec 或 symfony/process 库。到目前为止,没有什么对我有用。
这是我的表格 -
@extends('layouts.app')
@section('content')
<div class="container">
@include('includes.messages')
<h1>Create Scraper</h1>
{!! Form::open(['action' => 'ScraperController@store', 'method' => 'POST', 'novalidate' => 'novalidate']) !!}
<div class="form-group">
{{ Form::label('url', 'Search URL') }}
{{ Form::text('url', '', ['class' => 'form-control', 'placeholder' => 'Search URL']) }}
</div>
<div class="form-group">
{{ Form::label('email', 'Email') }}
{{ Form::email('email', '', ['class' => 'form-control', 'placeholder' => 'Email']) }}
</div>
<div class="form-group">
{{ Form::label('password', 'Password') }}
{{ Form::password('password', ['class' => 'form-control', 'placeholder' => 'Password']) }}
</div>
{{ Form::submit('Submit', ['class' => 'btn btn-primary']) }}
{!! Form::close() !!}
</div>
@endsection
这是我的控制器 -
我已经用进程库尝试过它没有给出任何错误,没有响应立即执行下面的代码但刮板运行不成功
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
public function store(Request $request) {
$this->validate($request, [
'url' => 'required',
'email' => 'required|email:rfc,dns',
'password' => 'required'
]);
$process = new Process(['C:\xampp\htdocs\scraper\public\lkscraper\venv\Scripts\python', 'C:\xampp\htdocs\scraper\public\lkscraper\lk.py']);
$process->run();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
echo $process->getOutput();
}
我还尝试了以下方法 - 我已经在我的机器中创建了所有全局依赖项并运行它。但在 laravel 中再次没有成功。但是相同的 shell_exec 运行良好,当在 laravel 项目之外作为单个文件运行时,我得到了所需的输出。
public function store(Request $request) {
$this->validate($request, [
'url' => 'required',
'email' => 'required|email:rfc,dns',
'password' => 'required'
]);
$output = shell_exec("python C:\xampp\htdocs\scraper\public\lkscraper\lk.py");
var_dump($output);
}
当我在单独的 php 文件中运行以下内容时,它可以正常工作。但是在laravel里面它不起作用
$output = shell_exec("python C:\xampp\htdocs\scraper\public\lkscraper\lk.py");
var_dump($output);
请帮我解决这个问题。我究竟做错了什么!感谢您的时间
我得到的错误:
string(1418) "Traceback (most recent call last):
File "C:\xampp\htdocs\scraper\lkscraper\venv\lib\site-packages\selenium\webdriver\common\service.py", line 72, in start
self.process = subprocess.Popen(cmd, env=self.env,
File "C:\Users\raman\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 854, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\raman\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1307, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\xampp\htdocs\scraper/lkscraper/lk.py", line 15, in
browser = webdriver.Chrome('driver/chromedriver.exe')
File "C:\xampp\htdocs\scraper\lkscraper\venv\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 73, in __init__
self.service.start()
File "C:\xampp\htdocs\scraper\lkscraper\venv\lib\site-packages\selenium\webdriver\common\service.py", line 81, in start
raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver.exe' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home