Как запустить сценарий python в laravel путем отправки формы? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь запустить сценарий автоматизации (сценарий python -selenium), который отбрасывает данные с веб-сайтов после ввода некоторых данных со стороны клиента. Я пытаюсь отправить учетные данные с помощью формы и обработать их с помощью shell_exe c или exe c или библиотеки 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\lkscrap\venv\Scripts\python', 'C:\xampp\htdocs\scraper\public\lkscrap\lk.py']);
    $process->run();
    if (!$process->isSuccessful()) {
        throw new ProcessFailedException($process);
    }
    echo $process->getOutput();        
}

Я также пробовал следующее - я сделал все зависимости глобальными на моем компьютере, чтобы запустить его. Но снова не удалось в laravel. Но тот же shell_exe c работает нормально, и я получаю желаемый результат при запуске как один файл вне проекта 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\lkscrap\lk.py");
    var_dump($output);       
}

Когда я запускаю следующее, сохраняя внутри отдельного файла php, он работает отлично. Но внутри laravel не работает

$output = shell_exec("python C:\xampp\htdocs\scraper\public\lkscrap\lk.py");
var_dump($output);

Пожалуйста, помогите мне решить эту проблему. Что я делаю не так! Спасибо за ваше время

Я получаю ошибку:

string(1418) "Traceback (most recent call last):
  File "C:\xampp\htdocs\scraper\lkscrapper\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/lkscrapper/lk.py", line 15, in 
    browser = webdriver.Chrome('driver/chromedriver.exe')
  File "C:\xampp\htdocs\scraper\lkscrapper\venv\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 73, in __init__
    self.service.start()
  File "C:\xampp\htdocs\scraper\lkscrapper\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
...