Модуль для парсигна html-страниц - Crawler.
Сперва его необходимо установить:
composer self-update composer require symfony/dom-crawler
Далее, в папке app создадим папку Parser
.
В созданной папке - создаем интерфейс ParseContract:
namespace App\Parser; Interface ParseContract { public function getParse($path); public function text($obj, $val = null); public function html($obj, $val = null); }
Для функций text() и html() создадим типаж:
namespace App\Parser; trait ParseTrait{ public function text($obj, $val = null) { $risk = $obj->filter($val)->count(); if ($risk == 0) { $rams = ''; }else{ $rams = $obj->filter($val)->text(); } return $rams; } public function html($obj, $val = null) { $risk = $obj->filter($val)->count(); if ($risk == 0) { $rams = ''; }else{ $rams = $obj->filter($val)->html(); } return $rams; } }
Имплементируем интерфейс:
namespace App\Parser; use Symfony\Component\DomCrawler\Crawler; use App\News; use Auth; class GoogleNews implements ParseContract { use ParseTrait; public $crawler; public function __construct() { set_time_limit(0); header('Content-Type: text/html; charset=utf-8'); } public function getParse($catalog="Belarus", $cat_id=null) { $ff = 'https://news.google.com/search?q='.$catalog.'&hl=en-US&gl=US&ceid=US%3Aen'; $file = file_get_contents($ff); $this->crawler = new Crawler($file); //$tt = $this->html($this->crawler, '.images_table'); $this->crawler->filter('.section')->each(function (Crawler $node, $i) { $name = $this->text($node, "h3"); $body = $this->text($node, ".esc-lead-snippet-wrapper"); $picture = $this->attr($node, ".esc-thumbnail-image", "src"); $obj = new News; $obj->name = $name; $obj->body = $body; $obj->picture = $picture; $obj->catalog = $cat_id; $obj->user_id = (Auth::guest())?0:Auth::user()->id; $obj->save(); sleep(1); }); } }
Рассмотрим контроллер, в котором будет происходить вызов класса парсинга:
namespace App\Http\Controllers; use App\Category; use App\Parser\GoogleNews; class AjaxController extends Controller { public function getNews(){ $cats = Category::all(); foreach($cats as $one){ $obj=new GoogleNews; $pars=$obj->getParse($obj->title, $obj->id); } } }