Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Парсим сайты средствами 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

http://pythono.ru/newsparse/

Как видим, парсинг сайтов на PHP очень легкое дело. Можете таким образом создавать себе на сайт любые полезные информеры, содержащие информацию с других сайтов.

Данный материал подготовлен @pythono.

54
97.499 GOLOS
На Golos с August 2017
Комментарии (1)
Сортировать по:
Сначала старые