Парсинг внешнего сайта на Yii 2.x (часть 2)

В предыдущей статье по парсингу (считыванию) сайта мы рассказали о извлечении данных с главной страницы Яндекса. Сегодня считаем программу телепередач с яндекса. Пример работ можно увидеть на сайте mir29.ru

Рассмотрим исходный код и сделаем комментарии к нему. Для начала привидем программный код контроллера, у нас это контроллер TeleprogramController

namespace app\controllers;

use Yii;
use GuzzleHttp\Client;
use yii\helpers\Url;

class TeleprogramController extends \yii\web\Controller
{

    public $layout = 'information';

    public function actionIndex()
    {
        // получаем дату телепрограммы из ссылки
        $date = Yii::$app->request->get('date');
        // подключаем Guzzle
        $client = new Client();
        // передаем параметры в запрос яндекса
        $res = $client->request('GET', 'https://tv.yandex.ru/20', ['query' => ['date' => $date,'grid' => 'main', 'period' => 'all-day']]);
        // получаем страницу
        $body = $res->getBody();
        // подключаем phpQuery для обработки страницы
        $document = \phpQuery::newDocumentHTML($body);
        // осуществляем поиск по столбцам телеканалов
        $tv_today = $document->find(".tv-grid__item"); 
        // запускаем цикл по всек столбцам телеканалов
        foreach ($tv_today as $elem) {
          $pq = pq($elem);  
          // считываем заголовок
          $title = $pq->find(".tv-channel-title__link a")->text();     
          // заголовок не должен быть пустым (на странице Яндекса есть пустые ячейки)
          if ($title != "") {
              // считываем изображение
              $picture = $pq->find(".tv-channel-title__icon span span.image");
              // считываем время и телепередачи
              $tv = $pq->find(".tv-channel-events__item");
      
              $text = "";  
              // форматируем время и телепередачи в одну строку
              foreach ($tv as $el) { 
                $pqq = pq($el); 
                $text = $text . '<div class="tvprogram">'.$pqq->find(".tv-event__time-text")->text()." <span>".$pqq->find(".tv-event__title-inner")->text().'</span></div>';
              }    
              // увеличиваем счетчик
              $i++;
              // добавляем в массив заголовки, изображения и программу телеканалов
              $mas[$i] = array('title' => $title, 'picture' => $picture, 'text' => $text);  
          }  
        }
        // передача данных в представление
        return $this->render('index', ['mas' => $mas]);
     }
}    

Второй шаг — это вывод телепередачи на сайт. Прокомментируем код представления index

            use yii\helpers\Html;
            use yii\widgets\Menu;
            /* @var $this yii\web\View */
            $this->title = 'Телевизионная программа';

            // устанавливаем русскую локализацию для даты
            setlocale(LC_ALL, 'ru_RU.UTF-8');
            // выводим меню с датами, по нажатию на ссылку будет передаваться параметр в контроллер
            echo Menu::widget([
                'items' => [
                    // телепрограмма на сегодня
                    ['label' => 'сегодня', 'url' => ['teleprogram/index', 'date' => date("Y-m-d")], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    // телепрограмма на завтра
                    ['label' => strftime("%a", time()+3600*24)." ".date("d.m", (time()+3600*24)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    // телепрограмма на послезавтра
                    ['label' => strftime("%a", time()+3600*24*2)." ".date("d.m", (time()+3600*24*2)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*2))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    ['label' => strftime("%a", time()+3600*24*3)." ".date("d.m", (time()+3600*24*3)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*3))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    ['label' => strftime("%a", time()+3600*24*4)." ".date("d.m", (time()+3600*24*4)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*4))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    ['label' => strftime("%a", time()+3600*24*5)." ".date("d.m", (time()+3600*24*5)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*5))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    ['label' => strftime("%a", time()+3600*24*6)." ".date("d.m", (time()+3600*24*6)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*6))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                    ['label' => strftime("%a", time()+3600*24*7)." ".date("d.m", (time()+3600*24*7)) , 'url' => ['teleprogram/index','date' => date("Y-m-d", (time()+3600*24*7))], 'options' => ['class' => 'btn btn-default waves-effect btn-color-orange-hor']],
                ],
                'options' => ['class' => 'programlist']
            ]);

    echo "<div class='row'>";
        foreach ( $mas as $key => $value ) 
            {
                echo  "<div class = 'col-xs-12 col-sm-6 col-md-6 col-lg-4 program margin-bottom'><table>";
                    echo "<tr><td class='first'>".$mas[$key]["picture"]."</td><td>"."<h4>".$mas[$key]["title"].'</h4></td></tr>';
                    echo "<tr><td colspan='2'>".$mas[$key]["text"].'</td></tr>';
                echo "</table></div>";
            }
    echo "</div>";   

Итак, с помощью не хитрых манипуляций мы считали Яндекс телепрограмму к себе на сайт

программа телепередач