Публикация на тему
Пример парсера youtube.com с использованием Laravel. Требуется сервер Apache и PHP 7.2 и выше.
Автор
Михалькевич Александр Викторович
Наименование Парсим youtube.com
Автор А.В.Михалькевич
Специальность Пример парсера youtube.com с использованием Laravel. Требуется сервер Apache и PHP 7.2 и выше.,
Анотация
Anotation in English
Ключевые слова
Количество символов 6545
В примере задействованы следующие инструменты
Apache - сервер;
MySQL - сервер баз данных;
PHP 7.2 - язык программирования;
Laravel - PHP фрэймворк;
После обновления менеджера зависимостей, передем в папку с проектом:
cd /var/www/laravel
Подключим зависимость DomCrawler с помощью следующей команды:
composer require symfony/dom-crawler
В папке /app создадим папку /Parser. В ней файл ParseContract.php. Рассмотрим содержимое файла.
namespace App\Parser;
Interface ParseContract
{
public function getParse();
//public function text($obj, $val = null);
//public function html($obj, $val = null);
}
Создаем еще один файл в этой же папке.
Файл Youtube.php
namespace App\Parser; use Symfony\Component\DomCrawler\Crawler; //use App\ProductUser; use App\Googlenew; use Auth; class Youtube implements ParseContract { use ParseTrait; public $crawler; public function __construct() { set_time_limit(0); header('Content-Type: text/html; charset=utf-8'); } public function getParse() { $ff = 'https://www.youtube.com/results?search_query=test'; $file = file_get_contents($ff); $this->crawler = new Crawler($file); $body=$this->crawler->filter('body')->html(); return $body; } }
Получив, таким образом страницу парсинга, можем пройтись по необходимым атрибутам:
public function getParse($country="Belarus") { $ff = 'https://www.youtube.com/results?search_query='.$country; $file = file_get_contents($ff); $this->crawler = new Crawler($file); $this->crawler->filter(".contains-addto")->each(function (Crawler $node, $i) { $pic = $node->filter('img')->attr('src'); $this->body .= $pic.'
'; }); return $this->body; }
<input type="text" placeholder="Url from Youtube" id="youtube_parse_url"> <input type="button" id="{{$category->id}}" value="Parse" class="parse"> <div id="empty"></div>
Подключаем скрипт parse.js
$('.parse').click(function(){ var url = $('#yotube_parse_url').val(); var id = $(this).attr('data-id'); console.log(url, id); });
Сперва создадим контроллер AjaxParseController
php artisan make:controller AjaxParseController
Перенесем данный контроллер в папку Admin
В файле routes/web.php создадим следующий маршрут
Route::group(['middleware'=>'admin'], function(){ Route::get('ajax/parse/catalog', 'Admin\AjaxParseController@getCatalog'); });
Рассмотрим контроллер. Т.к. сейчас он находится в папке Admin, то меняем namespace.
namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Parser\Aliexpress; class AjaxParseController extends Controller{ public function getCatalog(){ $url = $_GET['url']; $id = (int)$_GET['id'] $parse = new Aliexpress(); $parse->getParse($url, $id); } }
Снова возвращаемся к файлу parse.js. После определения переменных, запускаем ajax, который будет обращаться к серверу и передавать в него нужные значения.
$('.parse').click(function(){ var url = $('#parse_aliexpress').val(); var id = $(this).attr('data-id'); $.ajax({ type: 'get', data: 'id='+id+'&url='+url, url: '/ajax/parse/catalog', beforeSend: function(){ $('#empty').html(''); }, success: function(data){ $('#empty').html(data); }, error: function(msg){ console.log(msg); } }); });
Пробелы в названиях Yutube заменяет символами +.
$str = str_replace(" ", "+", $country);
Для перебора элементов воспользуемся методом each
$this->crawler->filter('.list-item')->each(function(Crawler $node, $i){ $name = $node->text(); $pic = $node->filter('img')->attr('src'); echo $name; echo ' - '.$pic; });
Подключаем модель к классу парсинга, и добавляем данные в базу.
use App\Product; ... $this->crawler->filter('.list-item')->each(function(Crawler $node, $i){ $name = $node->text(); $pic = $node->filter('img')->attr('src'); $obj = new Product; $obj->name = $name; $obj->picture = $pic; $obj->save(); }); ...