Публикации - Laravel

Решение типовых задач на Laravel - Парсинг

Модуль для парсигна 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);
        }
    }
}

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться


Изображения Видео

1. Подключение CKEditor https://artisansweb.net/install-use-ckeditor-laravel/#comments
2. Регистрация и авторизация https://know-online.com/post/laravel-reg
3. Что нового в Laravel 8 https://sergeymukhin.com/blog/chto-novogo-v-laravel-80
4. Авторизация Sanctum <iframe width="560" height="315" src="https://www.youtube.com/embed/MT-GJQIY3EU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>