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などを書くことでエラーをファイルに書き出しエラーの詳細を確認する

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

以上となります。

  • この記事を書いた人

コウダイ

文系・ノースキル・未経験・アラサー・地方住み・残業100時間超えの社畜ホテルマンから都内IT系上場企業のフルリモートWebエンジニアに転職した人。

都内IT系上場企業に勤務するWebエンジニア5年目|プログラミングスクールのテックキャンプ公式アンバサダー|新卒で手取り18万の地方ホテルマン6年→挫折→プログラミングを900時間勉強→転職活動100社以上応募→アラサー未経験から7ヶ月でフルリモートのWebエンジニアに転職し年収150万円UP|34歳2児のパパ|ブログ歴4年→月間6,000PV|エンジニア転職ノウハウ、プログラミング、Web制作、副業での稼ぎ方など、「時間や場所に縛られずに稼ぐ」方法を発信しています。

-PHP