動作環境
- 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などを書くことでエラーをファイルに書き出しエラーの詳細を確認する
などを行ってみてコマンドに間違いがあるのか、コマンドは実行されているがファイルにミスがあるため上手くいっていないのかなど原因を洗い出して確認してみると良いかと思います。
以上となります。