Парсим сайты средствами PHP не используя регулярные выражения
Бывает, что на каком-то сайте имеется информация, которую необходимо получить с помощью PHP скрипта. Это может быть курс криптовалюты, погода, свежие новости, или что-то другое. Реализовать парсинг в PHP можно с помощью curl и библиотеки phpQuery.
Чтобы использовать curl - он должен быть установлен и прописан в настройках php.ini. У многих хостеров curl включен по умолчанию, например у webhost1.ru. Если примеры из статьи у вас на сайте не работают, попросите хостера включить curl.
Кроме того нам понадобится библиотека phpQuery.
Это почти полный аналог jQuery портированный для PHP. Фактически, мы можем использовать документацию jQuery, чтобы пользоваться селекторами для выбора тех или иных HTML элементов в DOM. Почти все люди, знакомые с веб-разработкой знают синтаксис селекторов jQuery, поэтому с phpQuery проблем возникнуть не должно. В примере программы я оставлю очень подробные комментарии по использованным мной селекторам.
Клонируйте каталог phpQuery с гитхаба (командой git clone https://github.com/TobiaszCudnik/phpquery.git
) или скачайте его в виде zip архива. Нас интересует папка phpQuery, в которой лежит еще одна папка с таким же названием и файл phpQuery.php. Их нужно положить в директорию рядом с вашим скриптом.
Для примера, давайте спарсим с сайта https://coinspot.io/charts/ новости из мира криптовалют. Они расположены внизу под графиком курса биткоина.
Откроем исходный код заголовка одной из новостей:
http://pythono.ru/newsparse/1.png
Как видим, чтобы получить ссылку на новость, нам нужен CSS селектор .blog-title a
Но давайте не будем просто парсить заголовки, сделаем так, чтобы при нажатии на спарсенные ссылки, статья открывалась непосредственно на нашем сайте. При клике на ссылку, передадим через GET-переменные адрес страницы со статьей, и спарсим HTML код её контента. Для того чтобы узнать селектор контента статьи, откроем в браузере статью, и посмотрим её исходный код.
http://pythono.ru/newsparse/2.png
Основной контент лежит в div
с классом blog-content
. Значит селектор для выбора текста статьи будет таким .blog-content
Реализуем наш скрипт:
<?
include 'phpQuery.php'; // Подключаем phpQuery
// Теперь проверяем, не задан ли адрес новости в параметре $_GET['page']
if(!isset($_GET['page'])){
$url = "https://coinspot.io/charts/"; // Если параметр не задан, задаем URL страницы с заголовками новостей
$curl = curl_init($url); // Инициализируем curl по указанному адресу
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // Записать http ответ в переменную, а не выводить в буфер
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); // Этот параметр нужен для работы HTTPS
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0); // Этот параметр нужен для работы HTTPS
$page = curl_exec($curl); // Получаем в переменную $page HTML код страницы
$document = phpQuery::newDocument($page); // Загружаем полученную страницу в phpQuery
$elements = $document->find('.blog-title a'); // Находим все ссылки с классом ".blog-title a"
foreach ($elements as $el) {
$elem_pq = pq($el); // pq - аналог $ в jQuery
$url = $elem_pq->attr('href'); // Получаем значение атрибута 'href' ссылок
$text = trim($elem_pq->text()); // Получаем текст ссылок
echo('<a href="index.php?page='.$url.'">'.$text.'</a><br>'); // Формируем свои ссылки и выводим на наш сайт
};
} else {
$url = $_GET['page']; // Получаем URL новости по которой кликнули из параметра $_GET['page']
$result = strpos($url, 'https://coinspot.io/'); // Эта проверка нужна чтобы кулхацкеры не подставляли в GET свои сайты
if ($result === 0) {
$curl = curl_init($url); // Инициализируем curl по указанному адресу
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // Записать http ответ в переменную, а не выводить в буфер
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); // Этот параметр нужен для работы HTTPS
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0); // Этот параметр нужен для работы HTTPS
$page = curl_exec($curl); // Получаем в переменную $page HTML код страницы
$document = phpQuery::newDocument($page); // Загружаем полученную страницу в phpQuery
$elements = $document->find('.blog-content'); // Находим div с классом ".blog-content"
$elem_pq = pq($elements[0]); // pq - аналог $ в jQuery
$text = trim($elem_pq->html()); // Получаем HTML код выбранного ранее div-a
echo('<a href="index.php">Вернуться к списку новостей</a><br><hr><br>'); // Добавляем возврат к содержанию
echo($text); // Выводим текст новости
};
};
?>
Если будете копировать код, лучше копируйте отсюда, и не забудьте отдельно скачать phpQuery:
https://pastebin.com/Rd0Pxkch
Также в .htaccess укажите явно кодировку, чтобы не было крикозябр.
Скачать исходник вместе с phpQuery и .htaccess можно тут:
http://pythono.ru/newsparse/newsparse.zip
После запуска скрипта увидим спарсенный список новостей:
http://pythono.ru/newsparse/3.png
При клике на любую новость попадем в её текст:
http://pythono.ru/newsparse/4.png
И наконец, более красиво оформленная демо-версия скрипта, куда я добавил капельку CSS
Как видим, парсинг сайтов на PHP очень легкое дело. Можете таким образом создавать себе на сайт любые полезные информеры, содержащие информацию с других сайтов.
Данный материал подготовлен @pythono.