В предыдущей статье по парсингу (считыванию) сайта мы рассказали о извлечении данных с главной страницы Яндекса. Сегодня считаем программу телепередач с яндекса. Пример работ можно увидеть на сайте 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>";
Итак, с помощью не хитрых манипуляций мы считали Яндекс телепрограмму к себе на сайт