この記事に含まれること
- Laravelのバッチ(app/Console/Commands/)で、外部サイトのHTMLを取得する
この記事に含まれないこと
以下は、ゆくゆく追記していくかもすれねぇだ。
やり方
- バッチ(Command)を用意する
- HTML取得命令を記述する
1. バッチ(Command)を用意する
php arisan make:command クラス名
でベースとなるものを用意します。
上記のコマンドを叩くと、
app/Console/Commands/ 配下に、クラス名で指定したファイル名でベースとなるPHPファイルができます。
PHPファイルの中身の詳細はこちら
に載せてます。
2. HTML取得命令を記述する
上記で作成したPHPファイルの中の
public function handle()
{
//ここを編集していく
上記の中身を編集していきます。
HTML取得はこちらの記事様でシンプルでわかりやすくご記載頂いているのでこれを記述することで実行できるようになります。
例)
DOMDocument を使えるようにuse を追記しましょう
ただ、これだけだと、
DOMDocument
が見つからんよ、とエラーが出てしまうので
use DOMDocument;
を追記しましょう。
追記する場所は、
use Illuminate\Console\Command;
の直下とかでいいです。
↓
use Illuminate\Console\Command;
use DOMDocument; // 追記
または、
DOMDocument を new するときに、頭に「\」を追記するでもいいです。
$domDocument = new \DOMDocument();
頭に「\」を追記すれば、グローバル名前空間から DOMDocument クラスを探してくれます。
ポイント: htmlParseEntityRef: expecting ‘;’エラーが発生してしまう対応
先の記事のとおりにソースを記述してLaravel上でコマンド実行させようとすると、
ErrorException DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 6
というようなエラーが発生してしまい、処理が中断されてしまったので、(バニラPHP環境だとなんの問題も起きなかったです。)
libxml_use_internal_errors()を使用して、エラーを無視するように設定し、libxml_clear_errors()を使用して、エラーをクリアする処理を追記しています。これにより、エラーが発生してもコードが停止せず、解析を続けることができます。
本当はエラーを特定して、エラーが発生しないよう対処すべきと思いますが、僕の場合は、このやり方でほしい情報取得に支障がなかったので、良しとします。
ポイント:Laravelの場合、文字コードのエンコードを挟む必要がある!(嘘でした。)
※以下は嘘でした。これではうまくいきませんでした。しかし環境が違えば以下でうまくいく、など、何らかのヒントになるかもしれませんので残しておきます。
ポイントとして、
ソース中にコメントで書いてますが、
Laravelでこの処理を行う場合、
文字コードのエンコードを挟む必要があります。
(こちら参考にさせていただきました。助かりました。)
でないと期待通りにHTML要素が取得できません。
結構ハマりました。
Laravelだとデフォルトで文字コードがエンコードされている場合があるから、らしいです。
コメント