PHP

LaravelからPythonファイルを実行する方法

動作環境

  • macOS 12.0.1
  • Laravel 8.40.0
  • PHP 8.0.3
  • Python 3.9.2

LaravelベースのアプリケーションからPythonファイルを実行する方法を解説いたします。

Pythonでじゃらんの口コミをスクレイピングしてLaravelのstorageフォルダにcsvデータとして保存し、Laravelでcsvファイルをダウンロードする方法を実装してみます。

Pythonファイルを用意する

まず、スクレイピングを実行するPythonファイルを用意いたします。

じゃらんの口コミをスクレイピングしCSVファイルとして保存するプログラムを用意しています。

スクレイピングの実装方法はこちらの記事で解説しておりますのでよろしければご覧ください。

今回解説するファイル構成は下記のようになっております。

Laravel
 ┗ app
  ┗ Http
   ┗ KuchikomisController.php
  ┗ Python
   ┗ jalanCsvDownload.py

import requests
from bs4 import BeautifulSoup
import pandas
import sys

args = sys.argv

r = requests.get(args[1])
c = r.content

soup = BeautifulSoup(c, "html.parser")

body=soup.find_all("p",{"class":"jlnpc-kuchikomiCassette__postBody"})
date=soup.find_all("p",{"class":"jlnpc-kuchikomiCassette__postDate"})
score=soup.find_all("div",{"class":"jlnpc-kuchikomiCassette__totalRate"})

l=[]
for d, b, s in zip(date, body, score):
    data={}
    data["スコア"]=s.text
    data["口コミ"]=b.text
    data["投稿日"]=d.text.replace('投稿日:', '')
    l.append(data)

df=pandas.DataFrame(l)
df.to_csv("../storage/app/public/jalan.csv", encoding='utf_8_sig')
df
import sys
args = sys.argv

r = requests.get(args[1])

標準ライブラリのsysを利用して、コマンドの引数を取得しています。sys.argvでコマンド引数を取得することができるので、

args[1]とすることで実行するコマンドの第一引数であるじゃらんのURLを取得しています。

コントローラーを用意する

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Kuchikomi;
use Illuminate\Support\Facades\Storage;

class KuchikomisController extends Controller
{
    public function kuchikomi_csv_download(Request $request)
    {
        $pythonPath =  "../app/Python/";
        $command = "python3 " . $pythonPath . "jalanCsvDownload.py 2>error.log https://www.jalan.net/yad330474/kuchikomi/?screenId=UWW3001&yadNo=330474&smlCd=012102&distCd=01";
        
        // コマンドを実行
        exec($command, $outputs, $return);

        $filePath = '/public/jalan.csv';
        $fileName = 'jalan.csv';
        $mimeType = Storage::mimeType($filePath);
        $headers = [['Content-Type' => $mimeType]];
        return Storage::download($filePath, $fileName, $headers);
    }
}

コントローラー側には、実行したいPythonファイルのパスを記載します。

今回実行するコマンドはこちらです。引数に口コミを取得したいじゃらんのURLを記載しPythonファイルに渡しています。

python3  ../app/Python/jalanCsvDownload.py  2>error.log  https://www.jalan.net/yad330474/kuchikomi/?screenId=UWW3001&yadNo=330474&smlCd=012102&distCd=01

PHPのexec()関数でこちらのコマンドを実行いたします。

第一引数には実行したいコマンド、第二引数には出力されたコマンドの結果、第三引数には実行したコマンドのステータス値が格納されます。コマンドのステータス値は0が正常終了、0以外の数値の時は異常が発生しているということを示しています。

exec($command, $output, $return);
var_dump($output, $return_var);
→ array(0) {} int(0)

私の場合コマンドのパスの間違いにより実行されない場合があったので、うまくいかない場合はこちらの確認方法の他に、

①コマンドを直接ターミナルに打ち込んだ時にはうまく実行するか確認してみる

②コマンドに2>error.logなどを書くことでエラーをファイルに書き出しエラーの詳細を確認する

などを行ってみてコマンドに間違いがあるのか、コマンドは実行されているがファイルにミスがあるため上手くいっていないのかなど原因を洗い出して確認してみると良いかと思います。

以上となります。

  • この記事を書いた人

コウダイ

都内のWeb系自社開発企業に勤務するエンジニア|33歳1児のパパ|ブログ歴4年→月間6,000PV|新卒で手取り18万のホテルマン6年→プログラミングを900時間勉強→100社以上応募しアラサー未経験から7ヶ月でフルリモートのWEB系自社開発エンジニアに転職し年収100万円UP|【人生を自由に、ノンストレスで生きる】をテーマに、30歳で文系・異業種未経験からITエンジニアに転職したノウハウの他、プログラミングやブログで稼ぐ方法など、「時間や場所に縛られずに稼ぐ」方法を発信しています。

-PHP