Нано-агрегатор новин

Іноді трапляється необхідність витягти з якогось сайту контент: зображення, посилання чи тексти. Говорячи по-науковому, розпарити сайт. З благою метою робити це чи ні, справа Ваша. Я лише хочу продемонструвати, як це працює з технічного погляду.

Ідея агрегатора новин

Подивіться головну сторінку футбольного сайту.

новин
Нас цікавлять 2 моменти: головні новини (1) та статті із центральної колонки (2). Ми хочемо витягувати їх з цього сайту та відображати у себе в потрібному вигляді – ось так. Припустімо, що нам потрібно саме так :-)
нано-агрегатор

Посилання будуть вести на bombardir.ru, перейматися і перетягувати вміст новини до себе в тестовому проекті ми не будемо. Хоча до кінця уроку Ви легко зможете зробити це самі.

І звичайно ж, ці новини та статті будуть парситися динамічно. Тобто, відкривши демо-сторінку, ми побачимо актуальний контент – все те саме, що й виводиться на бомбардирі.

Отже, ідею позначили тепер трохи про бібліотеку парсингу.

Бібліотека phpQuery Основи.

Завантажити бібліотеку можна на гітхабі або знайти у вихідниках проекту. Це один-єдиний php-файл.

Сенс ліби дуже простий: на основі HTML-коду сторінки створюється об'єкт, в якому різними методами можна проводити маніпуляції з dom-елементами. Так, саме у php-коді. Можна шукати потрібні елементи, додавати нові вузли, міняти їх місцями. Загалом практично все, що дозволяє робити jQuery на клієнті. Бібліотеки дуже схожі щодо ідеології, назви багатьох методів і селекторів збігаються. Це ми побачимо трохи нижче, коли писатимемо парсер.

Дві речі, які нам потрібно знати для роботи. Перше - створення об'єкта (документу) phpQuery

Ідруге, як витягнути елементи за потрібними селекторами

Насправді все. Селектори, як бачимо, такі ж, як і в звичному css або jQuery.

Чек-лист того, що потрібно зробити.

Створюємо проект та підключаємо бібліотеку phpQuery

У корінь проекту закиньте файл бібліотеки phpQuery.php та створіть поряд index.php. Тепер потрібно в index.php підключити бібліотеку, це найпростіше.

Отримуємо html-код головної сторінки з bombardir.ru

Заодно створили змінні $ site і $ protocol - вони знадобляться при формуванні посилань.

Створюємо об'єкт phpQuery

Спойлер, як це робиться, вже був.

Витягуємо дані про головні новини

Перш ніж, засукавши рукави, зануритися код, потрібно розібратися, за якими селекторами витягуватимемо потрібну інформацію. Посидівши в інспекторі коду на сайті bombardir, ми з'ясуємо, що блок із головними новинами знаходиться у контейнері з класом.soc-news. Причому цих контейнерів на головній сторінці кілька, а потрібні новини знаходяться в першому рахунку.

Кожна новина знаходиться у блоці з посиланням.soc-text a. З цього посилання ми витягнемо і заголовок новини, і саме посилання. Тепер знаємо, що саме нам потрібно.

Розбираємось. Спочатку в змінну $newsItems заносимо елементи новин. Зверніть увагу на селектор.soc-news:first. Проте деякі відмінності від синтаксису на клієнті є - в css використовується властивість :first-child.

Потім створюємо порожній масив $news, до якого запишемо потрібні дані.

Витягуємо статті із центральної колонки

Тепер у нас у двох масивах $news та $articles є всі дані, про які ми домовлялися. Залишилося їх відобразити у більш-менш пристойному вигляді.

Створюємо шаблон

Створимо в корені проекту поки щопорожній файл template.php і підключимо його до index.php

З index.php закінчили, відкриваємо template.php. Там буде звичайний html-код із php-вставками. Вміст файлу з невеликою сумішшю php та html-коду, за традицією, картинкою (для копіпасти коду просто скачайте вихідні коди)

новин

Це звичайний html-файл. Таблиця з двох колонок: новини та статті. У циклах перебираються відповідні масиви та виводяться необхідні дані з них. У css/main.css підключені стилі, щоб виглядало не так страшно. Втім, вони особливо нікому не цікаві, а якщо копіпаститимете, то можна прямо тут.

І на цьому робота закінчена!

Що зрештою?

У нас вийшов досить простий, але кумедний агрегатор футбольних новин. phpQuery виявилася дуже легкою в освоєнні. Звичайно, ми торкнулися дуже малої частини, але для парсингу будь-якого сайту цього достатньо.

Варіантів застосування отриманої інформації є маса.

  • - Збирати новини з якого-небудь mail.ru (ідея не нова, але все-таки)
  • - гарячі акції та знижки в інтернет-магазинах (на цьому взагалі стартапи каламутять)
  • - курс валют прямо з головної сторінки яндекса (адекватні люди, звичайно, візьмуть відкриту XML-ку з сайту центробанку, але завжди бути адекватними нудно)
  • - І ще, і ще. Допишіть свої варіанти :-)