О сайтеПравилаКонтакты
  • Крипто
  • Новости
  • Статьи
  • Люди
  • Теги
» Статьи » Разработка » Пишем парсер новостей на PHP
  • Инструменты
  • Заработок
  • Раскрутка
19 января 2018 . Антон Кулешов

Пишем парсер новостей на PHP

Долгое время я вынашивал идею написать что-нибудь по теме парсинга контента, и вот решился! Начнём с самого тривиального, а потому, востребованного примера – парсинга новостей в рунете. Мы воспользуемся самым простым способом, который есть в PHP и разберем его максимально подробно. В дальнейшем это позволит нам написать более интересные вещи.

Для чего же ещё нам может понадобиться парсер новостей? И тут, честно говоря, вариантов достаточно, чтобы уделить время этой теме. Вот несколько примеров, которые я могу привести исходя из своего опыта.

Так как я в последние время работаю с интернет-магазинами, то стандартная задача от клиента, который только что зарелизил свой магазин или только собирается это сделать - наполнение каталога актуальными товарами, т.е. изображениями, ценами, описаниями товаров и т.д... Вручную это делать бессмысленно, для этого мы можем использовать сайт близкий по тематике, а необходимый контент оттуда спарсить.

Второй пример будет касаться сегодняшней темы – это парсер новостей. Представьте ситуацию, когда необходимо отслеживать изменения новостей и появление новых на десятке различных сайтов по определённым ключам, и транслировать их своим посетителям. К примеру, такой популярный новостной портал как tjournal использует для этого своих роботов или, проще говоря, скрипты, которые парсят новостные ленты и самое интересное отображают у себя.

Основной принцип написания парсера, а в нашем случае парсера новостей – это получить страницу со стороннего ресурса, вытянуть из нее необходимый контент и обработать его. И вся ирония, заключается в том, что не всегда приходит, то, что мы ожидаем. Как с этим бороться мы рассмотрим в других статьях, а сегодня возьмем идеальный вариант и попробуем спарсить новостную ленту Яндекса на главной странице.

novostnaya-lenta-dlya-parsera

Первое, что мы должны сделать, это проанализировать HTML разметку и посмотреть, где находятся нужные нам новости:

proanalizirovat-html-razmetku

Все записи лежат в двух списках. Первый это видимый, а второй скрытый для эффекта смены. Сама же новость обернута ссылкой:

proanalizirovat-html-razmetku-novost-obernuta-ssylkoj

После того, как мы получим страницу, нам потребуется вытянуть все эти ссылки, у которых мы возьмем текст и значение атрибута href.

Какие же инструменты и библиотеки нам потребуются для этого? Во-первых, сам механизм для получения контента со стороннего ресурса, сегодня я использую для этого функцию file_get_contents(). Во-вторых, библиотека для разбора контента, одна из известных и удобных - phpQuery.

Итак, приступим, в качестве сервера использовать я буду opensever, где создам новый сайт parser.loc, куда через composer установлю библиотеку phpQuery. Делается это довольно просто, открываем консоль (можно воспользоваться консолью нашего сервера):

konsol-servera

Перейдем в папку с нашим сайтом:

cd domains/parser.loc
konsol-servera-perejdem-v-papku-s-nashim-sajtom

Теперь нужно установить phpQuery, найти нужный пакет можно на сайте packagist:

packagist

Вернемся в консоль и установим пакет, а следом создадим файл index.php и завершим работу с консолью:

composer require electrolinux/phpquery
copy con index.php
konsol-servera-composer

Всё, что нам нужно для работы мы подготовили, теперь приступим к написанию кода и в исполняемый файл подключим библиотеку:

require_once("vendor/autoload.php");

Далее вытянем страницу и сразу отобразим её для проверки:

$html = file_get_contents("https://yandex.ru/");

echo($html);
vytyanem-stranitsu-i-srazu-otobrazim

Самый главный этап мы сделали, осталось спарcить названия новостей и их ссылки, для удобства результат можно поместить в массив:

phpQuery::newDocument($html);

$links = pq("#tabnews_newsc")->find("a");

$tmp = array();

foreach($links as $link){

    $link = pq($link);

  $tmp[] = array(
     "text" => $link->text(),
        "url"  => $link->attr("href")
 );
}

phpQuery::unloadDocuments();

Работа с DOM деревом phpQuery схожа с jQuery. Поэтому эта библиотека очень хорошо подходит для задачи разбора страницы, конечно можно использовать и другие инструменты, но зачем? Вкратце, что тут происходит: полученную страницу мы передаем методу newDocument(), как итог мы получаем объект документа, с которым далее и работаем. Очень важно в конце всех манипуляций удалить его из памяти! Делается это при помощи метода unloadDocuments(). Вытянуть новости не особо ресурсозатратная операция, но если вы решили спарсить пару сотен страниц и их обработать, то вы ощутите всю необходимость подчищать память. В phpQuery функция pq() соответствует функции из jQuery $(). Поэтому внутри, по аналогии, мы втягиваем все ссылки и сохраняем их в массив. Для визуализации давайте отобразим их на странице:

<ul>
   <?php foreach($tmp as $value): ?>
 <li>
      <a href="<?php echo($value["url"]); ?>" target="_blank">
          <?php echo($value["text"]); ?>
      </a>
  </li>
 <?php endforeach; ?>
</ul>
sparshinye-novosti-yandeks-na-stranitse

Вот и всё! Наш парсер новостей на PHP готов. Сегодня мы рассмотрели самый быстрый способ, но для того, чтобы спарсить более сложные страницы file_get_contents() не подойдет, мы можем при желании передать и заголовки при обращении на страницу донора, но если там установлен редирект, нам будет необходимо это отслеживать и следовать за ним. Эта функция больше подходит для работы с различными API. Для написания более универсального парсера можно воспользоваться CURL, где многие вещи сделать удобнее, но об этом мы поговорим в одной из следующих статей.

#Парсер
28 594 12
Антон Кулешов
Пишем парсер контента на PHP
Алексей Дементьев
Алексей Дементьев
04 августа 2018
Очень хороший пример!!!
Я пытаюсь получить некоторую часть контента со своего же другого сайта.
Все получается, кроме одной детали. Я получаю и подключаю нужную таблицу стилей, но шрифты не отрабатываются.

В консоле браузера " Access to Font at 'Сайт донора/css/RobotoRegular/roboto-regular-webfont.woff2' from origin 'Мой сайт ' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'Мой сайт' is therefore not allowed access. "
--
Никак не могу понять почему файлы шрифтов не доступны.
В папке со шрифтами сайта донора я прописал .htaccess
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
---
Ничего не помогает.
Антон Кулешов
Антон Кулешов
05 августа 2018
Рад, что статья помогла. Касательно ошибки, тут надо решать вопрос с админом хостинга/сервера.
Штиф Васлер
Штиф Васлер
07 декабря 2018
phpQuery не развивается с 2009 года, целесообразно ли использовать ее сейчас в принципе? Или я ошибаюсь?
Антон Кулешов
Антон Кулешов
07 декабря 2018
Штиф Васлер, приветствую! Да вы правы, что phpQuery не развивается с 2009 года, но почему бы и не использовать? Все зависит от поставленной задачи. Для разбора не сложных страниц, на данный момент, можно смело использовать. Если ее возможностей будет не хватать, то есть и другие для этого инструменты.
Штиф Васлер
Штиф Васлер
25 декабря 2018
Изучая вопрос выбора парсера, стало ясно, что phpQuery для крупных задач, к сожалению, не годится (слишком медленная скорость). Решил остановиться на DiDom. Интересно было бы узнать, работали ли с ним вы, что о нем думаете?
Антон Кулешов
Антон Кулешов
25 декабря 2018
К сожалению с DiDOM не работал, но по доке, которую я успел почитать – весьма годная библиотечка. Добавил к себе в закладки, если будут задачи с парсингом обязательно попробую ее опробовать.
Турар Аюп
Турар Аюп
31 мая 2019
require_once("vendor/autoload.php");
Этот код куда вписать надо?
Антон Кулешов
Антон Кулешов
31 мая 2019
Перед скриптом парсера
noName
noName
05 сентября 2019
Уродская статья! Вырваные куски из контекста.. Автор - если начал писать для новичков - пиши полностью! К тебе в мозг никто заглянуть не может для того, чтобы понять что ты имел в виду!
Антон Кулешов
Антон Кулешов
05 сентября 2019
noName, Трудно комментировать, глупость! Статья максимально разбирает простой пример парсинга. Описан принцип, откуда, что и как парсится. Так же добавлены картинки и все необходимые команды. Если читать статью сверху вниз, а не выдёргивать куски, то ни вижу проблем в её понимании.
Viral
Viral
11 октября 2019
Всё хорошо, только у меня последний кусок кода не выводится на страницу.
Написан так:
<ul>
<?php foreach($tmp as $value): ?>
<li>
<a href="<?php echo($value["url"]); ?>" target="_blank">
<?php echo($value["text"]); ?>
</a>
</li>
<?php endforeach; ?>
</ul>

А выводи вот так на страницу:
<ul>
</ul>
Андрей Глеба
Андрей Глеба
04 марта 2021
Viral, нужно смотреть актуальны id дива на странице Яндекса. Он может меняться. Например, у меня все получилось так:
$links = pq("#news_panel_news")->find("a");

А дальше код не зависит от названий идентификаторов.

И в целом рекомендую вардампить каждый результирующий массив, для отладки.

Автор, рекомендую в этот textarea вставлять отправленный ранее текст постом, а то я нажал кнопку "Написать" и у меня произошла перезагрузка страницы с ошибкой авторизации и текст сбросился :/. Хорошо что я его скопировал перед отправкой :).

Удаляем дубли WordPress

Как добавить просмотры в WordPress

Популярное
1 Пишем парсер контента на PHP2 Кликджекинг как соцфишинг, пишем скрипт для получения id пользователя вконтакте3 Лучший способ прижать футер используя flexbox4 Пишем первый модуль для 1С-Битрикс с использованием ядра D75 Делаем подгрузку контента при прокрутке страницы
Обратите внимание