今回の件、どのような状態かというとLaravelのコントローラー側でスクレイピングした内容を、リストとしてviewに全件表示させようとすると、最後の情報だけが件数分リストにずらっと表示されてしまうのです。
logを確認すると、このようになっています。
ループするごとに1件、1件2件、1件2件3件、1件2件3件4件...
と増えていけばいいと思うのですが、これを見ると2回目のループでは既に1件目は2件目に上書きされています。
こちらはコントローラーの問題のメソッドになります。
public function event_list(){ $client = new Client(HttpClient::create(['verify_peer' => false, 'verify_host' => false])); // 配列をviewに渡すと表示できなかったのでオブジェクトを生成しました。 $obj = new \stdClass(); // テーブル情報からスクレイピングに必要な情報を呼び出しています $sql_42 = 'select url, element_path from scrape where id = 42'; $s_42 = DB::select($sql_42); // テーブル情報をもとに、取得したい項目をそれぞれループして取得しています foreach($s_42 as $data){ $url = $data->url; $crawler = $client->request('GET', $url); $link = $crawler->filter($data->element_path)->filter('ul > li > a') ->each(function($node){ return $node->attr('href'); }); $src = $crawler->filter($data->element_path)->filter('div > img') ->each(function($node){ return $node->attr('src'); }); $alt = $crawler->filter($data->element_path)->filter('div > img') ->each(function($node){ return $node->attr('alt'); }); $text = $crawler->filter($data->element_path)->filter('p.campaign_banner_term') ->each(function($node){ return $node->text(); }); Log::debug($link); } $imageAnnotator = new ImageAnnotatorClient(); $seiyu = []; $shop_count = 0; // スクレイピングで取得したimg要素をOCR処理しています。 for($i = 0; $i < count($src); $i++){ $path = 'https://www.seiyu.co.jp' . $src[$i]; $image = file_get_contents($path); $response = $imageAnnotator->documentTextDetection($image); $annotation = $response->getFullTextAnnotation(); # Log::debug out detailed and structured information about document text if ($annotation) { $allblockText = ''; foreach ($annotation->getPages() as $page) { foreach ($page->getBlocks() as $block) { $block_text = ''; foreach ($block->getParagraphs() as $paragraph) { foreach ($paragraph->getWords() as $word) { foreach ($word->getSymbols() as $symbol) { $block_text .= $symbol->getText(); } } $block_text .= " "; // Log::debug($block_text); } $allblockText .= $block_text; } } } $imageAnnotator->close(); // これまでに取得したリンク要素や画像文書をそれぞれのプロパティにセットしています $eventLink = 'https://www.seiyu.co.jp' . $link[$i]; $obj->eventLink = $eventLink; $obj->text = $text[$i]; $obj->alt = $alt[$i]; $obj->img_text = $allblockText; $seiyu[$shop_count] = $obj; $shop_count++; Log::debug($seiyu); } // オブジェクトを配列の中にセットしました $output = []; $output['seiyu'] = $seiyu; return view('eventList', $output); }
こちらはviewになります
<body> <div class="pb-3"> @if(isset($seiyu)) <h4>西友</h4> <ul> @foreach($seiyu as $data) @if(!empty($data->img_text) or !empty($data->text)) <li> <a href="{{ $data->eventLink }}" target="_blank">{{ $data->img_text }}</a> <small>{{ $data->text }}</small> </li> @endif @endforeach </ul> @endif </div> </body>
ここでのオブジェクトクラスの使用法にはあまり自信はありません。
とりあえずは上書させずに1件ずつ表示させたいです。
どうかお力をいただければ幸いですm(__)m
あなたの回答
tips
プレビュー