Парсим контент к себе на сайт

Очень часто у владельцев сайтов возникает необходимость публикации каких-то динамических данных с других сайтов. Например, кому-то нравится публиковать информацию о погоде в своем городе, кто-то публикует программу телепередач для любимого канала, различные анонсы и т.п. Упростить задачу можно с помощью парсера. В нашем случае напишем его на php и условимся, что ваш хостинг его поддерживает. Никаких особых навыков программирования не требуется.

Парсер контента: введение

Допустим, интересующая нас информация есть на каком-нибудь стороннем сайте и там же обновляется. Разумеется, можно периодически посещать сайт с информацией, копировать ее оттуда и обновлять у себя на сайте пресловутыми: Ctrl+C и Ctrl+V. Но можно и не заходить, а поручить задачу несложному скрипту - парсеру, который по требованию: зайдет на сайт-донор, найдет и вырежет нужную нам информацию и отобразит ее на нашем сайте. Проще говоря, информация с другого сайта будет публиковаться на вашем в полностью автоматическом режиме. Если перспектива для вас радужная - читаем далее.

Я упускаю размышления об этической стороне этого дела, коснемся лишь технической стороны. Также не призываю никого использовать данный метод во вред кому бы то ни было! Разобравшись с техническими нюансами, вы сможете впоследствии приготовить специфические информеры для своего сайта, предоставлять своим пользователям актуальную и  востребованную ими информацию. Здесь все зависит от полета вашей мысли!

Итак, пишем свой скрипт, который заходит на какой-нибудь сайт, выдергивает кусок нужной нам информации и публикует его на нашем сайте.  Никаких программистских навыков от вас не требуется, делаем все попунктно и пробуем реализацию на своем блоге.

Реализация парсера на PHP

Пожалуй, самый ответственный момент в нашем случае - это поиск донора, то есть сайта, на котором будет появляться интересующая нас информация. Сайт должен работать бесперебойно, выполнять свои обязанности по обновлению информации исправно и текст должен быть открытый (то есть, открыв исходный код страницы в браузере - мы должны видеть там интересующую нас информацию).

Когда сайт-донор и нужная нам страница для парсинга найдена, запоминаем ее урл и переходим к следующему этапу. Создаем в блокноте текстовый файл, например parser.php и помещаем в него следующий код:

<?php

//откуда будем парсить информацию
 $content = file_get_contents('полный урл страницы с http:// с которого будем вырезать информацию');

// Определяем позицию строки, до которой нужно все отрезать
 $pos = strpos($content, 'здесь кусок кода/текста который размещен перед нужным текстом');

//Отрезаем все, что идет до нужной нам позиции
 $content = substr($content, $pos);

// Точно таким же образом находим позицию конечной строки
 $pos = strpos($content, 'здесь кусок кода/текста который стоит в конце нужного нам текста');

// Отрезаем нужное количество символов от нулевого
 $content = substr($content, 0, $pos);

//если в тексте встречается текст, который нам не нужен, вырезаем его
 $content = str_replace('текст который нужно вырезать','', $content);

// выводим спарсенный текст.
 echo $content;

echo "вставляем сюда завершающий код";
 ?>

Итак, какие-то 8 строчек кода и сторонний контент автоматически публикуется на нашем блоге. Зеленым цветом в коде обозначены места, которые вы обязательно должны отредактировать.

Нужны пояснения к кускам кода/текста? Тут все просто, мы должны указать начальную и конечную позицию в тексте, который нужно парсить. Открываем исходную страницу на сайте-доноре и ищем нужный нам текст. Как правило, он будет начинаться с какой нибудь html-разметки, что-то типа этого - <td><p><strong><em> и заканчиваться такой же абракадаброй - например, </td><td>&nbsp;</td><td>&nbsp;</td></tr>. Копируем эти символы в начальную и конечную позиции (2 и 3 строчки кода). Помним, наш скрипт спарсит текст, который находится между этими позициями на сайте.

parser.php готов. Копируем его в корень своего сайта и запускаем в браузере http://мой сайт/parser.php. Если вы все сделали правильно, вы увидите вырезанный/спарсенный кусок текста. Разумеется, он индексируется и не содержит никаких следов того, что вы его забрали с другого сайта.

Интеграция парсера на PHP в WordPress

Итак, парсер готов. Его работа протестирована, результатом довольны. Но как показать спарсенный контент на странице или в записи wordpress?

Если мы вставим вышеприведенный код в запись вордпресс пусть даже в режиме html, то в целях безопасности скрипты вордпресса его попросту вырежут - цензура не пропустит.

Решение находим, установив плагин, разрешающий вордпресс публиковать код php прямо в записи. Ищем какой нибудь плагин типа "Allow PHP in Posts and Pages" и смело заходим в редактор страницы/записи в вордпресс и в нужное место на странице вставляем вызов нашей страницы.

[ php]
$content = file_get_contents('http://мой сайт/parser.php');
echo $content;
[ /php]

Как видите, все просто. Проверяем работу скрипта, опубликовав запись. Если наблюдаются иероглифы в спарсенном контенте, последнюю строчку в этом коде перезаписываем на что-то типа этого:

 echo iconv("windows-1251", "UTF-8", $content);

Со значениями windows-1251 и UTF-8 играем, переставляя (зависит от начальных кодировок сайта донора и пациента).

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

С вами был Вячеслав, на возникшие вопросы отвечу в комментариях.

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (24 голоса, рейтинг: 4,50 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

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

166 комментарий

  1. Дима says:

    Вячеслав, добрый вечер необходимо спарсить текст, со страницы gosbank.su /category/vyplata/, которая находится на wordpress. Я как только не пробовал, просто пустая страница, хотя с остальными сайтами в порядке эксперимента всё получилось, подскажите как быть

  2. Алексей says:

    Вячеслав, доброго времени суток.
    Подскажите, как получить данные с сайта с авторизацией? Например, сайт ezwow org, к сожалению, данные (из раздела оружейная-гильдии) можно получить только после авторизации на сайте. Как реализовать доступ на базе данного парсера? Спасибо за ответ и рекомендации.

    1. Вячеслав Скоблей says:

      Чтобы получить авторизацию на PHP используйте библиотеку Snoopy https://github.com/endroy/Snoopy

  3. Виталий says:

    Добрый день. Код отлично работает и парсит в моём случае анонсы. Но есть одно но. Анонсы на сайте доноре появляются не всегда, соответственно немного меняются теги, в этом случае парсер не находит начальный и конечный текст и выводит страницу сайта донора целиком. Возможно ли как-то решить эту проблему ? Спасибо.

    1. Вячеслав Скоблей says:

      В таком случае, проверяйте наличие начального тега. Если он есть, делайте:

      echo $content;

      В противном случае, ничего не делайте.

      1. Виталий says:

        Прошу прощения, только начал разбираться с PHP. Понимаю, что нужно определить условие для вывода echo, а как это реализовать, честно не знаю, по этому прошу помощи. Спасибо.

        $content = file_get_contents('адрес сайта донора');
        $pos = strpos($content, 'начальный тег');
        $content = substr($content, $pos);
        $pos = strpos($content, 'конечный тег');
        $content = substr($content, 0, $pos);
        $content = str_replace('color:#f30707','display: none', $content);
        echo iconv ("UTF-8", "windows-1251" , $content);
        1. Вячеслав Скоблей says:

          Вместо последней строчки:

          echo iconv ("UTF-8", "windows-1251" , $content);

          такой код:

          if (strpos($content, 'начальный тег') !== false) {
          echo iconv ("UTF-8", "windows-1251" , $content);
          }

          P.S. Скрипт находит в спарсенном контенте кусок кода - "начальный тег", который можно заменить на любой кусок который явно есть в анонсе. Если такой кусок встретится в спарсенном контенте, на экран будет выведено echo!

          1. Виталий says:

            Огромное спасибо. Хорошее дополнение к вашему парсеру, которое делает его довольно гибким.

  4. Никита says:

    Привет! Подскажите пожалуйсьта! Если конечно, это возможно! А как можно спарсить ссылку strima, которая находится в скрипте? т. е. плейер находится во фрейме, он берёт поток с другого файла, и показывает видео. Сама ссылка потока типа: .m3u8 находится между тегов ниже. я пробовал, но парсер его не видит.

  5. says:

    Прошу прощение если не в тему, но парсить контент и делать самообновляющуюся страницу это чуть чуть разные вещи. Я хотел у вас просить совета/помощи по возможности реализации страниц с плей листом эфира интернет радиостанции, ведь они (плей листы) находятся в свободном доступе в соответствующем формате (не буду умничать не знаю точно.) Прошу рассказать, если это возможно на страницах вашего замечательного сайта как сделать постоянно обновляющуюся страницу с плей листом. Пример: online-red.com/radio/playlist/RUS-radio.html не реклама ни в коем случае.

  6. Fan says:

    А что делать, когда в исходном коде много одинаковых тегов? Например, хочу парсить курсы с банка, но там все курсы обернуты в одинаковые теги.
    Если брать более отдаленные уникальные теги, то потом между тегами столько мусора, что не вырезать.
    И что с кириллицей? если в тегах попадаются кириллические буквы, то они тоже лезут в спарсенную инфу.

    1. Вячеслав Скоблей says:

      Рекомендую в таком случае смотреть в сторону Xpath.

      1. Fan says:

        Всё намного проще. Купил плагин Skraper от codecanyon, лютая вещь, указываем что парсить, и он сам парсит ))

        1. Rlbeor says:

          привет и как тебе плагин?)) как полное название?

  7. Vladimir says:

    Привет. Что, если мы спарсили ссылки вида

    <a href="/clubs/clubs_10.html" rel="nofollow">Крылья Советов</a>

    , а нужно оставить только Крылья Советов, без ссылки? Вариант с удалением каждой не подходит — их много и они могут меняться.

    1. Вячеслав Скоблей says:

      Попробуйте функцию strip_tags (она удаляет из строки теги HTML и PHP. Синтаксис простой:
      echo strip_tags($text);

  8. Владимир says:

    Вячеслав, во-первых, благодарю за статью!

    Хотелось бы уточнить такой момент. С одной и той-же страницы сайта донора мне необходимо спарсить 2 значения, находящиеся в разных строках. Для этого я несколько модифицировал Ваш код:

    ввел $content1 и $content2. И в этом же файле сделал вывод переменных на сайт с помощью конструкции:

    (Тут кстати попутный вопрос: это нормально, что идут сразу два обращения к одному и тому же ресурсу:

    $content1 = file_get_contents('https://донор');
    $content2 = file_get_contents('https://донор');

    или это можно как то оптимизировать?

    На самом сайте добавляю код (согласно статье):

    [ php]
    $content = file_get_contents('http://мой сайт/parser.php');
    echo $content;
    [ /php]

    Таким образом, получаю, как и хотел, две переменные - все отлично.

    Но вопрос, как закешировать файл с двумя переменными?

    1. Вячеслав Скоблей says:

      file_get_contents, по идее, должен быть один (зачем 2 раза его тянуть?).
      Уже разбирая полученный результат вы можете вводить разные переменные: $pos, $pos2...

      1. Владимир says:

        Вячеслав, вот не совсем понятно, как разбирать. Сейчас код имеет вид:

        //вывожу на сайт:

        Подскажите, пожалуйста, как его модифицировать, чтобы запрос к донору был один. И по поводу кэширования с двумя переменными тоже остается для меня загадкой...

        1. Вячеслав Скоблей says:

          Пришлите ваш код посредством обратной связи на сайте (кнопочка внизу)

    2. Степан Шувалов says:

      Вячеслав, спасибо огромное за статью. В результате кучи мучительных проб и ошибок в практике парсинга, получилось только по твоему рецепту!
      Не выходит только с картинками.
      На доноре путь к картинкам относительный, с 6-мя уровнями вложенности, причем, имя одной из папок меняется.
      Т.е. путь к изо выглядит так:
      http://донор.ru/папка_1/папка_2/папка_3/папка с переменным названием_$1/папка_5/изо1.jpg
      http://донор.ru/папка_1/папка_2/папка_3/папка с переменным названием_$1/папка_5/изо1.jpg
      ...
      http://донор.ru/папка_1/папка_2/папка_3/папка с переменным названием_$n/папка_5/изо_n.jpg
      Можно ли с этим что-то поделать?

      1. Вячеслав Скоблей says:

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

        $content = str_replace('<img src="//папка','<img src="https://donor.ru/папка', $content);
        

        В данном скрипте не предусмотрена закачка картинок донора, да и в большинстве случаев это и не нужно.

        1. Степан Шувалов says:

          УРРА!!! получилось, я на небесах!
          Благодарю, Вячеслав!

          1. Степан Шувалов says:

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

            1. Вячеслав Скоблей says:

              Смотрите консоль в Хроме!

  9. DOLCE GABBANA says:

    Вячеслав подскажите пожалуйста, как мне сделать сайт который будет отображать данные сайта донора где 50 миллионов страниц.

    1. Вячеслав Скоблей says:

      Скрипт парсинга обычно располагается на одной странице. В него передается параметром урл для парсинга. Таким образом: у вас будет на сайте физически 1 страница, а в поиске может быть хоть 50 миллионов. Правда при условии, что ваш хостинг выдержит сканирование такого объема поисковыми ботами (что не так просто на практике)

  10. Людмила says:

    Добрый день! По предложенному Вами в статье коду получилось спарсить необходимую информацию с сайта-донора. Сейчас есть необходимость подтянуть на свой сайт иную информацию, но проблема в том, что этот сайт открывается по адресу http://193.7.160.230/web/esimo/black/wwf/wwf_black.php и с предложенным ранее кодом спарсить этот материал не получается. Подскажите, пожалуйста, как правильно парсить информацию, открывающуюся на сайте с подобным адресом? Благодарю!

    1. Вячеслав Скоблей says:

      Парсить как и обычно (предварительно загрузив стили и js файлы на свой сервер и подключив их в результативном файле)

  11. Андрей says:

    Здравствуйте Вячеслав!
    Подскажите пожалуйста, а как спарсить информацию например по коду товара?
    К примеру есть интернет магазин где размещен товар у которого есть код (артикул), а также указано его количество, которое постоянно меняется.
    Как по коду (артикулу) парсить меняющееся количество товара?
    Заранее спасибо!

  12. Александр says:

    Здравствуйте Вячеслав. Спасибо за инструкцию как спарсить данные с другого сайта, получилось перенести топ100 на страницу http://game.speed100.ru/Top100, но есть еще вопрос. На самой странице топ100 соответственно 100 игроков, которые могут меняться, в зависимости от их активности игры. Вот как парсить данные с ссылок каждого игрока http://game.speed100.ru/InfoUser?ID=Keri5Java, т.к. там имеется небольшая статистика проведенных игр.

  13. 123 says:

    А возможно вырезать несколько фрагментов из кода на одной странице? Допустим div до закрытия div и p и до закрытия p?

    1. Вячеслав Скоблей says:

      Попробуйте создать 2 обработчика события, то есть введите новые переменные: $pos2 и $content2 в рамках одного скрипта

  14. Иван says:

    Здравствуйте. Реализовал парсер на PHP.

    <?php
    $content = file_get_contents('http://m.ya.ru/news.aspx?network=1000000666292');
    $pos = strpos($content, '');
    $content = substr($content, $pos);
    $pos = strpos($content, '');
    $content = substr($content, 0, $pos);
    echo $content;
    ?>

    Все получилось. Вывел меню (пример меню далее):
    Новости:

    1. Новость №1 ( - это ссылка на новую страницу http://m.ya.ru/news.aspx?network=1000000666292&news=1400000 )
    2. Новость №2 ( - это ссылка на новую страницу http://m.ya.ru/news.aspx?network=1000000666292&news=1435500 )
    3. Новость №3 ( - это ссылка на новую страницу http://m.ya.ru/news.aspx?network=1000000666292&news=2033325 )
    4. Новость №4 ( - это ссылка на новую страницу http://m.ya.ru/news.aspx?network=1000000666292&news=1435525 )

    Если нажать на ссылку Новость №1 или Новость №2 и т.д. переходишь на основной сайт m.ya.ru/.... Как сделать так что при нажатии ссылки реализовался новый парсер? Сами новости и ссылки регулярно меняются и невозможно прописать конкретный адрес. Если возможно покажите на конкретном примере. Спасибо.

    1. Вячеслав Скоблей says:

      Как сделать так что при нажатии ссылки реализовался новый парсер? Сами новости и ссылки регулярно меняются и невозможно прописать конкретный адрес. Если возможно покажите на конкретном примере.

      1. Допишите к спарсенным ссылкам:

      http://ваш-сайт.ру/parser.php?p=http://m.ya.ru/news.aspx?network=1000000666292&news=1400000

      это можно сделать так:

      $content = str_replace('http://m.ya.ru/news.aspx?network=','http://ваш-сайт.ру/parser.php?p=http://m.ya.ru/news.aspx?network=', $content);

      Теперь в parser.php принимайте переменную:

      if(!empty($_GET))
      {
      $url = htmlspecialchars (strtolower(trim($_GET['p'])));
      }

      И подставляйте ее как новый урл для парсинга:

      $content = file_get_contents($url);
      1. Максим says:

        Принцип понятен. Только при переходе по ссылке попадаешь на предыдущую страницу. Думаю это из за спец символа &. Возможно он делит ссылку. Как это можно обойти?

        1. Вячеслав Скоблей says:

          Все верно. Символ & из урла теряется путем передачи GET запросом. Вижу выход изначально перед оправкой кодировать и потом декодировать урл, но как это сделать - не знаю. Что скажет гугль?

          1. Максим says:

            А $_POST тоже самое возможно сделать? Конечно интересный вопрос с этим get.

            1. Вячеслав Скоблей says:

              Возможно. Но $_POST запросом не будет формироваться ссылочная структура на сайте (данные не передаются в уникальной строке браузера)

              1. Максим says:

                Да. Вы правы. Только не понятно: а что кодировать? Ведь второй кусок ссылки неизвестен. Да и меняется он. Гугл дает только urlencode, а как его сюда применить - не понятно.

                1. Вячеслав Скоблей says:

                  Я только понял, что...

                  &amp, &copy и &pound разбираются браузером и используется как реальная сущность, а не желаемое имя переменной. Это очевидный конфликт, на который W3C указывает в течение многих лет. См. подробности: » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2

                  1. Максим says:

                    Извините, что пристал, но меня тоже интересует данный вопрос. На всех сайтах работает, а где спец символы нет.
                    Заметил что если во втором файле $content = file_get_contents($url); за место $url подставить адрес, где будет спец символ, то страница открывается, а в адресной строке прописан адрес который мы передали через get. Так вот можно заменить в $content = file_get_contents(сюда подставить то что отражается в адресной строке браузера);

                    1. Вячеслав Скоблей says:

                      $url передается через get запрос, где его собственно и режет. Есть методы кодирования и декодирования $url при передаче, просто поищите.

    2. Сергей says:

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

      И что если на сайте не текст, а код

      то есть я про marker_price_usd, на стороннем сайте это имеет вид цифр, которые и требуется извлекать и отображать на своём сайте.

      Такие значения парсить так же как в статье описано или как-то иначе?

      Спасибо за разъяснения.

  15. Юрий says:

    День добрый! Подскажите если в контенте находятся изображения, они в данном парсинге не выводятся?

    1. Вячеслав Скоблей says:

      Если путь картинки указан абсолютный, то как и обычный html код, будет показана картинка с внешнего сервера в спарсенном контенте.
      Если путь относительный, то естественно, вы не увидите картинки (так она будет искаться на вашем сервере, где ее нет).
      Ситуации можно исправить, добавив некоторую обработку кода:

      $content = str_replace('src="/foto/"','src="http://сайт-источник.ru/foto/"', $content);
    2. Иван says:

      При таком раскладе открывается та же самая страница.

      1. Вячеслав Скоблей says:

        При каком раскладе? На шаге 2 (два) вы должны парсить содержимое новости (как я понимаю), а вы по-прежнему парсите ссылки новостей.

  16. Виталий says:

    [ php]
    $content = file_get_contents('http://мой сайт/parser.php');
    echo $content;
    [ /php]

    При вставки данного кода весь сайт наперекосяк!!! ПРИЧИНА?

    1. Вячеслав Скоблей says:

      А сам php срабатывает? Если да, значит в нем не закрытый какой-либо тег (таблицы, блока и т.д.). Для начала запустите сам скрипт мой сайт/parser.php и проверьте его на валидность, например здесь: https://validator.w3.org/nu/

      1. Виталий says:

        Да, сам скрипт срабатывает.

        вот что выдал валидатор

        -------------------------------------------------------------------------\
        Error: Start tag seen without seeing a doctype first. Expected e.g. .

        From line 1, column 1; to line 1, column 24

        <a hre

        Error: Element head is missing a required instance of child element title.

        From line 1, column 1; to line 1, column 24

        <a hre

        Content model for element head:
        If the document is an iframe srcdoc document or if title information is available from a higher-level protocol: Zero or more elements of metadata content, of which no more than one is a title element and no more than one is a base element.
        Otherwise: One or more elements of metadata content, of which exactly one is a title element and no more than one is a base element.

        Error: Stray end tag div.

        From line 4, column 13; to line 4, column 18

        Error: Stray end tag div.

        From line 39, column 9; to line 39, column 14

        >↩ ↩ ↩ ↩ <

        Error: Stray end tag div.

        From line 272, column 1; to line 272, column 6

        Error: The itemprop attribute was specified, but the element is not a property of any item.

        From line 2, column 17; to line 2, column 57

        Боевик

        Error: The itemprop attribute was specified, but the element is not a property of any item.

        From line 3, column 21; to line 3, column 80

        16+</d

        1. Вячеслав Скоблей says:

          Так не разобрать, нужно видеть в живую

          1. Виталий says:

            Проверьте на валидаторе

            1. Вячеслав Скоблей says:

              Там 4 не открытых div.
              Смотрите ошибки: Stray end tag div
              Естественно, будет ломать верстку.

              1. Виталий says:

                Будем пробывать

              2. Виталий says:

                Спасибо мил человек, как говорят век живи век учись!!!

              3. Виталий says:

                Попался как ШКОЛЬНИК даже неудобно

              4. Виталий says:

                Добрый день Вячеслав!

                Еще один вопрос: как захватить изображения?

                1. Вячеслав Скоблей says:

                  Если ссылки относительные, делаем их абсолютными:

                  $content = str_replace('<img scr="/image/"','<img scr="http://cайт.ру/image/', $content);

                  Если Вас интересует парсинг картинок с закачкой на свой сервер, то это уже отдельная тема для отдельной статьи.

                  1. Виталий says:

                    Спасибо за помощь Вячеслав, но чет с картинками не получается... Благодарю.

      2. says:

        Очень полезная статья. Но, в php не силен, поэтому у меня возникла проблема с выводом спаршенного контента. Мне нужно вывести спаршенный текст на странице straniza.php в определенном месте, например между тегами . Как это сделать? И еще, не совсем ясно, что вставлять в последней строчке между кавычками: echo "вставляем сюда завершающий код";

        1. Вячеслав Скоблей says:

          вставляем сюда завершающий код

          Можете ничего не вставлять, если спарсенный контент не ломает всю верстку вашей страницы. Например, при парсинге, может отсутствовать завершающий </div>, </span>, </table> и т.д. Поэтому, если его нет в спарсенном контенте, то «вставляем сюда завершающий код».

          1. says:

            Со всем разобрался, все работает. Еще такой вопрос: можно, как-то парсить текст, например, те же гороскопы, которые меняются каждый день, и выводить на определенной, отдельной странице, завтра спарсить новый текст и вывести на новой тсранице и так далее, сохраняя прежние, отдельные страницы, генерируя тем самым новые?

  17. Владимир says:

    Вячеслав, подскажите как заменить значение на свое при выводе, например слово на англ. заменить на русское?

  18. andrey says:

    Доброго времени суток, у меня самописный движок написанный на php + mysql . Файл parser.php такого формата - sql_parse.php
    внутри вот такая байда...

    <?php
    /***************************************************************************
    *
    *   These functions are mainly for use in the db_utilities under the admin
    *   however in order to make these functions available elsewhere, specifically
    *   in the installation phase of phpBB I have seperated out a couple of
    *   functions into this file.  JLH
    *
    \***************************************************************************/
    
    //
    // remove_comments will strip the sql comment lines out of an uploaded sql file
    // specifically for mssql and postgres type files in the install....
    //
    function remove_comments(&$output)
    {
       $lines = explode("\n", $output);
       $output = "";
    
       // try to keep mem. use down
       $linecount = count($lines);
    
       $in_comment = false;
       for($i = 0; $i < $linecount; $i++)
       {
          if( preg_match("/^\/\*/", preg_quote($lines[$i])) )
          {
             $in_comment = true;
          }
    
          if( !$in_comment )
          {
             $output .= $lines[$i] . "\n";
          }
    
          if( preg_match("/\*\/$/", preg_quote($lines[$i])) )
          {
             $in_comment = false;
          }
       }
    
       unset($lines);
       return $output;
    }
    
    //
    // remove_remarks will strip the sql comment lines out of an uploaded sql file
    //
    function remove_remarks($sql)
    {
       $lines = explode("\n", $sql);
    
       // try to keep mem. use down
       $sql = "";
    
       $linecount = count($lines);
       $output = "";
    
       for ($i = 0; $i  0))
          {
             if (isset($lines[$i][0]) && $lines[$i][0] != "#")
             {
                $output .= $lines[$i] . "\n";
             }
             else
             {
                $output .= "\n";
             }
             // Trading a bit of speed for lower mem. use here.
             $lines[$i] = "";
          }
       }
    
       return $output;
    
    }
    
    //
    // split_sql_file will split an uploaded sql file into single sql statements.
    // Note: expects trim() to have already been run on $sql.
    //
    function split_sql_file($sql, $delimiter)
    {
       // Split up our string into "possible" SQL statements.
       $tokens = explode($delimiter, $sql);
    
       // try to save mem.
       $sql = "";
       $output = array();
    
       // we don't actually care about the matches preg gives us.
       $matches = array();
    
       // this is faster than calling count($oktens) every time thru the loop.
       $token_count = count($tokens);
       for ($i = 0; $i  0)))
          {
             // This is the total number of single quotes in the token.
             $total_quotes = preg_match_all("/'/", $tokens[$i], $matches);
             // Counts single quotes that are preceded by an odd number of backslashes,
             // which means they're escaped quotes.
             $escaped_quotes = preg_match_all("/(?<!\\\\)(\\\\\\\\)*\\\\'/", $tokens[$i], $matches);
    
             $unescaped_quotes = $total_quotes - $escaped_quotes;
    
             // If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal.
             if (($unescaped_quotes % 2) == 0)
             {
                // It's a complete sql statement.
                $output[] = $tokens[$i];
                // save memory.
                $tokens[$i] = "";
             }
             else
             {
                // incomplete sql statement. keep adding tokens until we have a complete one.
                // $temp will hold what we have so far.
                $temp = $tokens[$i] . $delimiter;
                // save memory..
                $tokens[$i] = "";
    
                // Do we have a complete statement yet?
                $complete_stmt = false;
    
                for ($j = $i + 1; (!$complete_stmt && ($j < $token_count)); $j++)
                {
                   // This is the total number of single quotes in the token.
                   $total_quotes = preg_match_all("/'/", $tokens[$j], $matches);
                   // Counts single quotes that are preceded by an odd number of backslashes,
                   // which means they're escaped quotes.
                   $escaped_quotes = preg_match_all("/(?

    с переводом выглядит вот так..

    <? PHP 
    / ********************************************** ***************************** 
    * 
    * Эти функции в основном для использования в db_utilities под админа 
    * однако для того , чтобы они функции , доступные в других местах, в частности 
    * на этапе монтажа PHPBB я из отделена пару 
    * функций в этом файле. JLH 
    * 
    \ *********************************************** **************************** / 
    
    // 
    // remove_comments обнажат SQL строки комментариев из загруженного файла SQL 
    // специально для MSSQL и тип Postgres файлы в установке .... 
    // 
    функция remove_comments (& $ выход) 
    { 
       $ прямых = взрываются ( "\ N", $ выход); 
       $ выход = ""; 
    
       // Попытаться сохранить MEM. использовать вниз 
       $ LineCount = Count ($ строк); 
    
       $ in_comment = ложь; 
       для ($ I = 0; $ г <$ LineCount; $ я ++) 
       { 
          если (preg_match ( "/ ^ \ / \ * /", preg_quote ($ строки [$ я]))) 
          { 
             $ in_comment = TRUE; 
          } 
    
          Если (! $ In_comment) 
          { 
             $ выход. = $ Линии [$ я]. "\ п"; 
          } 
    
          Если (preg_match ( "/ \ * \ / $ /", preg_quote ($ строки [$ я]))) 
          { 
             $ in_comment = ложь; 
          } 
       } 
    
       Витруальные ($ строки); 
       вернуть $ выход; 
    } 
    
    // 
    // Remove_remarks удалит SQL строки комментариев из загруженного файла SQL 
    // 
    функции remove_remarks ($ SQL) 
    { 
       $ линии = взрываются ( "\ N", $ SQL); 
    
       // Попытаться сохранить MEM. использовать вниз 
       $ SQL = ""; 
    
       $ LineCount = COUNT ($ строк); 
       $ выход = ""; 
    
       для ($ I = 0; $ г  0)) 
          { 
             если ( Исеть ($ строки [$ я] [0]) && $ строки [$ я] [0]! = "#") 
             { 
                $ выход. = $ линии [$ я]. "\ п"; 
             } 
             Еще 
             { 
                $ выход = "\ п". 
             } 
             // Торговля немного скорости для более низкого MEM. использовать здесь. 
             $ линии [$ я] = ""; 
          } 
       } 
    
       Вернуть $ выход; 
    
    } 
    
    // 
    // Split_sql_file разделится загруженный файл SQL на отдельные операторы SQL. 
    // Примечание: ожидает урезать () , чтобы уже работать на $ SQL. 
    // 
    Функция split_sql_file ($ SQL, $ разделителем) 
    { 
       // Разделить нашу строку в "возможных" утверждений SQL. 
       $ токенов = взрываются ($ разделителем, $ SQL); 
    
       // Попытаться спасти MEM. 
       $ SQL = ""; 
       $ = выходной массив (); 
    
       // Мы делаем на самом деле не заботиться о матчах дает нам пропитанного связующим веществом. 
       $ = массив ссылок (); 
    
       // Это быстрее , чем вызов подсчет ($ oktens) каждый раз через петлю. 
       $ token_count = COUNT ($ токенов); 
       для ($ I = 0; $ г  0))) 
          { 
             // Это общее количество одиночных кавычек в маркере. 
             $ total_quotes = preg_match_all ( "/" / ", $ лексемы [$ I], $ соответствует); 
             // Считает одиночные кавычки, которым предшествует нечетное число обратных косых черт, 
             // что означает , что они избежали цитаты. 
             $ escaped_quotes = preg_match_all ( "?! / (<\\\\) (\\\\\\\\) * \\\\ '/", $ лексемы [$ I], $ соответствует); 
    
             $ unescaped_quotes = $ total_quotes - $ escaped_quotes; 
    
             // Если число неэкранированных котировок даже, то разделитель не происходило внутри строки буквальным. 
             если (($ unescaped_quotes% 2) == 0) 
             { 
                // Это полный текст заявления SQL. 
                $ вывода [] = $ лексемы [$ я]; 
                // Сохранить память. 
                $ лексемы [$ я] = ""; 
             } 
             Еще 
             { 
                // неполное SQL заявление. продолжать добавлять маркеры , пока у нас не будет полной. 
                // $ Темп будет держать то , что мы имеем до сих пор. 
                $ Temp = $ лексемы [$ я]. $ разделителем; 
                // Сохранить память .. 
                $ лексемы [$ я] = ""; 
    
                // У нас есть полное заявление еще? 
                $ complete_stmt = ложь; 
    
                для ($ J = $ + 1; ($ complete_stmt && ($ J <$ token_count)!); $ j ++) 
                { 
                   // Это общее количество одиночных кавычек в маркере. 
                   $ total_quotes = preg_match_all ( "/" / ", $ лексемы [$ J], $ соответствует); 
                   // Считает одиночные кавычки, которым предшествует нечетное число обратных косых черт, 
                   // что означает , что они избежали цитаты. 
                   $ escaped_quotes = preg_match_all ( "/ (

    1.Что можете посоветовать? раньше вроде парсил но с ошибками.
    2.Файл htaccess и robots могут блокировать функционал парсера?
    3.если можно - ответьте на почту,

  19. says:

    Я уже писал сюда, но похоже автор счел мой комент неуместным. Да и бог с ним.
    1. Спасибо огромное, правда говорят, что обучение процесс двух людей, ученика и учителя, и неважно кто и в какой роли выступает на данном этапе. Важно, что есть те кто не умеет объяснить, а есть те кто может.
    2. Для тех кто юзает Yii 1 , (личный опыт) , чтоб вывести $content необходим в view или index добавить вот такой код:

    getBaseUrl(true) . '/' .'parser_.php');
            print_r($content); ?>

    3. Вопрос в зал, ну и к автору. Я получаю страницу с новостями, ссылки заменил, ненужные теги убрал (хотя это пипец), представте если с сайта приходит ссылка : прокоментировать
    Как? такое вырезать.
    4. Ну наконец такой вопрос - а мы можем вырезать между определенными тегами в оном парсере.
    Чтоб было понятно:

    // Определяем позицию строки, до которой нужно все отрезать
     $pos = strpos($content, '');
    //Отрезаем все, что идет до нужной нам позиции
     $content = substr($content, $pos);
    // Точно таким же образом находим позицию конечной строки
     $pos = strpos($content, '');
    // Определяем позицию строки, до которой нужно все отрезать
     $pos = strpos($text, '');
    
    //Отрезаем все, что идет до нужной нам позиции
     $text = substr($text, $pos);
    
    // Точно таким же образом находим позицию конечной строки
     $pos = strpos($text, '');
    и тд, и работать с кусками, а при выводе тупо склеить их
    echo $content . $text;
  20. Mary says:

    Автор! От ныне я твоя фанатка!
    Все просто и доходчиво написано, даже я - блондинка, разобралась)
    Есть вопрос: а можно ли вот такой "фокус" только наоборот?
    что бы парсер был на HTML

  21. алекс says:

    как сделать поиск спарсеного контента? т.е. поиск с чужого сайта но вывода на своем

  22. Михаил says:

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

  23. Сергей says:

    Наипростейшее и наипонятнейшее решение. БлагоДарю вас!

  24. У меня такой вопрос. Если информация на странице выложена в виде анонсов, как новости, а необходимо открыть полный текст, и именно его записать на страницу (конкретную php страницу) в виде html кода.

  25. TINAG says:

    Здравствуйте.
    Парсер работает на все 100.
    Однако наткнулся на проблему.
    Текст(рандомный)
    Текст(рандомный)
    Текст(рандомный)
    Как спарсить все три строки, если они все начинаются одинаково? (при парсинге страницы данный скрипт парсит только первую строку)

    1. Вячеслав Скоблей says:

      Смотрите выше, наверняка
      Текст(рандомный)
      Текст(рандомный)
      Текст(рандомный)
      обрамлен каким-то общим тегом.

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

    1. Вячеслав Скоблей says:

      Если вы парсите данные курса валют (например, как здесь http://seo-zona.ru/kurs-valyut-na-php-delaem-informer-iz-xml-2015-12-13.html), то все значения у вас будут в переменных. С этими переменными вы можете осуществлять любые математические функции на php.

      1. Спасибо, Вячеслав....попробую сделать через XML, парсил просто по коду как в этой статье....

    2. server says:

      Вячеслав, Здравствуйте.. у меня чуть не стандартная ситуация сможете помочь с парсером?
      мне надо с этого контента http: //***/#/ вытащить конкретную информацию скажем Pool Hash Rate
      в таблицу на свой сайт ? ка это реализовать. Я пробовал вашим скриптом но ничего не получилось

      1. Вячеслав Скоблей says:

        Ответил Вам на почту

  27. says:

    Подскажите, как сделать так, чтобы к спарсенному контенту добавлялся адрес.
    Так как парсится код с картинками, а картинки на сайте доноре указаны не явным адресом т.е. без указания адреса сайта.

    1. Вячеслав Скоблей says:

      Перед выводом спарсенного контента, заменяйте нужную вам информацию на свою. Например, вам нужно вставить адрес к картинкам (если он не указан):

      $content = str_replace('/images/','http://домен.ru/images/', $content);
  28. says:

    Здравствуйте
    Прошу подсказать как сделать так чтобы ваш парсер парсел по url но чтобы этот url я мог менять и спарсеные данные записывать в базу данных
    И также хотелось бы узнать как сделать так чтобы ваш парсер мог если указано url главной страницы сайта а там указано кородкая новости сайта то парсер мог переходит на полную новости сайта и оттуда собирал инфу и записывал в базу данных

    1. Вячеслав Скоблей says:

      Что касается первого вопроса, то все просто. В самое начало скрипта добавим, вместо строчки:

      $content = file_get_contents('полный урл страницы с http:// с которого будем вырезать информацию');

      Такой код:

      $urlsite = $_GET['url'];
      $content = file_get_contents($urlsite);

      Теперь вы можете обращаться к вашему скрипту и передавать ему параметром GET разные url, например:

      http://sait.ru/parser.php?url=http://адрес_страницы откуда парсить.html

      По поводу второй части вопроса. Спарсенные данные у вас в переменной $content. Собственно, эту переменную и записываете в базу, например (запрос к вашей базе не подойдет, все индивидуально, показано лишь для наглядности):

      INSERT INTO table VALUES ('','$content','','')
      1. says:

        Спасибо работает но у вас Отпечатка нужно убрать )

        И также хотелось бы узнать как сделать так чтобы ваш парсер мог если указано url главной страницы сайта а там указано кородкая новости сайта то парсер мог переходит на полную новости сайта и оттуда собирал инфу и записывал в базу данных

        1. Вячеслав Скоблей says:

          В рамках данного скрипта такое сложно реализовать. Нужно писать второй скрипт, который дергает все ссылки-анонсы, помещает их в массив, а уже там вы ими оперируете и передаете ссылки в скрипт, который мы совместно с вами написали.

          1. says:

            Если это не сложно можем ли мы его написать
            Данный ваш парсер я использую для парсенга из авто сайта у всех авто сайтов нет RSS и ваша тема тут как раз нужная

            1. Вячеслав Скоблей says:

              Чтобы писать - нужно время!

              у всех авто сайтов нет RSS

              А как же http://feed43.com https://feedity.com и им аналогичные сервисы построения RSS из контента?

              1. says:

                То что по ссылки и те что в интернете не подходить
                То что вы пишите она то что нужно но нужно немного доработать чтобы его внедрить в свой CMS
                Вы пишите казалось бы простой код зато его легко доработать и внедрить в свой CMS и при этом она работает

  29. Олег says:

    И на мой пожалуйста:)

    С http все работает отлично!!! Как быть с https?!

    1. Андрей says:

      какая разница то? я например mail ru c https запросто получаю. Скорее всего ты что то не так делаешь =)

      1. Олег says:

        Да нет, я все то делаю! Просто по http все норм, c https не чего не выходит. Искал в сети, куча тем куча решений, но эти решения либо не работают либо заморочены на столько, что я тупо не вытягиваю:)

        Сбрось свой пример парсера с майла!

        1. Андрей says:

          лучше ты напиши сайт который хочешь с https сделать .... и что в нем спарсить... я тебе сделаю и скажи куда скинуть....

          1. Олег says:

            Ну вот с майла, к примеру я хочу спарсить гороскоп Овна(текстовую часть)
            https://horo.mail.ru/prediction/aries/today/

            1. Андрей says:

              в php теги не забудь подставить

              //откуда будем парсить информацию
               $content = file_get_contents('https://horo.mail.ru/prediction/aries/today/');
              
              // Определяем позицию строки, до которой нужно все отрезать
               $pos = strpos($content, '');
              
              //Отрезаем все, что идет до нужной нам позиции
               $content = substr($content, $pos);
              
              
              // Точно таким же образом находим позицию конечной строки
               $pos = strpos($content, '');
              
              // Отрезаем нужное количество символов от нулевого
               $content = substr($content, 0, $pos);
               
              
              
              
              
               
              
              //если в тексте встречается текст, который нам не нужен, вырезаем его
              $content = str_replace('','', $content);
              
              
              // выводим спарсенный текст.
               echo $content;
            2. Андрей says:

              теги вырезались https://yadi.sk/d/G4FvamBItWR48 закачал на яндекс файл

              1. Олег says:

                Да, сработало... Видимо я где то тупанул:)) Спасибо!

  30. Андрей says:

    Привет как сделать rss спарсеного сайта?

    1. Вячеслав Скоблей says:

      Вопрос непонятен до конца.

      1. Андрей says:

        я сделал полностью копию сайта "лента.ру" мобильная версия, даже со своим дизайном, Пример: Liareg.ru
        Но поскольку новости не в базе MYSQL не могу создать rss ленту....

        mysitemapgenerator.com/rss/create.html этот сайт отлично справляется но обновляемая лента платная... Может знаешь как создать генерируемую rss ленту на php без mysql . В интернете не нашел толком ничего

        1. Вячеслав Скоблей says:

          Уточните, вы тяните новости по урлу или записываете их в файлы на своем хостинге?
          Если у них однотипная RSS, берите RSS аналогично у них, подменяя урлы на свои.

          1. Андрей says:

            по урлу... на сайте всего три файла ,index , url , и мои style
            я пробывал парсить так же как сайт, rss, и заменить ссылки на свои, но там теряется структура xml.. получается ссылка и название, на rss файл совсем не похоже=)

  31. Олег says:

    С http все работает отлично!!! Как быть с https?!

  32. Олег says:

    Выдает вот такую ошибку! Не подскажете что делать?!
    Функция в php.ini включена, написано - allow_url_fopen = On

  33. РОМА says:

    Подскажите как можно спарсить товар и заменить цену??? Я спарсил, вроде все ровно, но надо заменить цену... то есть не в рублях а к примеру в долларах, как можно сделать?

    1. Вячеслав Скоблей says:

      Загрузите данные в Exel, там можно в таблицах многое сделать!

  34. Вячеслав приветствую,хотел сделать бегущую строку с информера погоды,и столкнулся проблемками
    Сам информер на сайте донора имеет такой вид

    846
    °C
    °F
    ощущается как 5 °C41 °F2 часа назад на метеостанции (38 км) было +5.8 °C,
    +42 °F, пасмурная погода, атмосферное давление в пределах нормы, высокая влажность (71%), легкий ветер (2 м/с) (7 км/ч) (4 мили/час) (4 узла) (2 Бфрт), дующий с северо-северо-востока. Слабый дождь.

    Мне что все лишнее вырезать через str_replace или есть варианты?
    Мне нужно привести все это к виду
    8
    ощущается как 5 °C
    пасмурная погода, атмосферное давление в пределах нормы, высокая влажность (71%), легкий ветер (2 м/с) (7 км/ч)

  35. Андрей says:

    Здравствуйте, подскажите, как вывести последнюю серию с помощью парсинга. Код выглядит к примеру вот так:
    Серия 2
    Серия 3
    Серия 4
    Серия 5
    Серия 6
    Серия 7

    все что мне нужно это вывести последнюю серию, то есть "Серия 7"

    1. Вячеслав Скоблей says:

      В принципе, все элементы можно поместить в массив и извлечь последний элемент посредством array_pop
      Пример:

      $films= array("Серия 2", "Серия 3", "Серия 4", "Серия 5", "Серия 6", "Серия 7");
      array_pop($films);

      Хотя целесообразно исходить из имеющегося кода.

  36. Роман says:

    Добрый день. Позволю дополнить парсер, фоновым обновлением спарсенного контента. Полезно, например, для парсинга расписания электричек.
    1. Создаём файл .html
    2. В пишем:
    //кодировка
    //подключаем jquery: просто указываем путь до библиотеки,которая наверняка уже есть на сайте.
    3. В пишем:
    //выводим контент в контейнере.

    function show()//обращаемся к функции ajax
    {
    $.ajax({
    url: "parser_mn.php", // путь до парсера
    cache: false,// не кешируем
    success: function(html){
    $("#content").html(html);//выводим контент
    }
    });
    }
    $(document).ready(function(){
    show();
    setInterval('show()',600000);//интервал обновления в м/с
    });

    4. В парсере,самой первой строкой,после <?php, я бы поставил кодировку:header('Content-Type: text/html; charset=utf-8'); дабы избежать кракозябров.
    П.С. Побольше нужно таких ресурсов, как Ваш. Спасибо за парсер! Кратко,ёмко и по делу.

    1. Роман says:

      Теги вырезались,поправлю:
      2. В заголовке пишем: Charset=UTF-8 //кодировка
      jquery-1.3.2.min.js//подключаем jquery- просто указываем путь до библиотеки,которая наверняка уже есть на сайте.
      3. В теле пишем див: div id="content" и тут-же закрываем div ,естественно заключаем дивы в ">" //выводим контент в контейнере.
      Далее по первому тексту...

      1. Вячеслав Скоблей says:

        Роман, понятно. Я не силен в JS, подскажите, если параметр в ajax поставить cache: true, то как и каким образом происходит кеширование данных, как управлять интервалом кеширования? Само кеширование - актуально для посещаемых ресурсов.

        1. Роман says:

          Что-то мне подсказывает, что включать кеш нет необходимости. Т.к. велика вероятность, отображения старой\закешированной информации.Но так как я и сам не силён в jquery, предлагаю с позволения ссылку на неплохой мануал по функции ajax http://jquery.page2page.ru/index.php5/Ajax-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81

  37. Михаил says:

    Здравствуйте, вы не могли бы дать пример рабочего кода в файле parser.php и куда его положить в вордпрессе и где конкретно если можно так сказать путь нажатий прописать другую часть кода на странице и какого если можно рабочий пример.

    1. Вячеслав Скоблей says:

      В статье приведен код парсера php (здесь можете посмотреть реализацию), пример внедрения на страницы Вордпресс, пример реализации на стороннем сайте...

  38. Иван says:

    Вячеслав, огромное Спасибо + небольшое "спасибо" отправил на WebMoney.
    Кстати, здесь:
    [ php]
    $content = file_get_contents('http://мой сайт/parser.php');
    echo $content;
    [ /php]
    после квадратных скобок стоят пробелы, и пока я их не убрал, ничего не работало. Насколько я понимаю, сделано это намеренно, но для тех, кто не в курсе, наверное, можно об этом упомянуть.

    1. Вячеслав Скоблей says:

      Спасибо, Иван! Про скобки все верно, иначе не дает опубликовать код на сайте в статье!

  39. Алексей says:

    Очень интересная статья.
    Но вот какой возник вопрос - а реально подобными действиями спарсить весь сайт полностью? Т.е. сделать зеркало на другом домене. При этом сайт только на PHP и TXT, DAT файлах.

    морально-этическую сторону не тревожим, там всё ОК. Просто готовится переезд, который затянулся уже на годы... :(( А ежедневно обновлять вручную файлы не хватит никакого времени.

    1. Вячеслав Скоблей says:

      Спарсить можно, но это будет html-версия сайта (без движка).
      Можно перетянуть контент сайта таким же образом на движок, но это уже будет парсинг+настройка сайта

  40. Вопрос. А как сделать зависимый парсинг?
    например мне надо для каждой игры свой рейтинг
    есть название которое потом можно вклеить в путь сайта донора
    $content = file_get_contents('http://tesera.ru/game/Spot_It/
    должно менятся фрагмент "Spot_It" на название другой игры .. страница которой открыта пользователем в интернет магазине

    1. Вячеслав Скоблей says:

      До конца не понял, но вам нужно использовать переменные (передавать их в скрипт POST или GET запросом).

  41. Для начала Все работает, помогло с первого раза разобрался
    щас в joomla попробую впыжить ))

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

    1. Вячеслав Скоблей says:

      Я не призываю парсить Вас авторские статьи, парсер полезен для информеров погоды, курса валют, расписания кинотеатров и т.д.

  43. Юрий says:

    Добрый день. Подскажите, в чём может быть проблема - при вставке в вордпрессовский редактор кода

    [ php]
    $content = file_get_contents('http://мой сайт/parser.php');
    echo $content;
    [ /php] 

    на странице ничего не отображается, хотя любой другой php-код в редакторе работает нормально.
    Может ли быть причина в том, что функция file_get_contents запрещена на моём хостинге? Можно ли это как-то исправить?

    1. Вячеслав Скоблей says:

      Для начала проверьте, мой сайт/parser.php - не вызывает белую страницу?
      И поинтересуйтесь у поддержки хостинга, включена ли функция file_get_contents? Если нет, то какие из альтернатив.

  44. Илья says:

    Виктор Андреевич, попробывал спрасить сайт. Все получилось. Но вот когда возникла задача спаристь около 100 сайтов хорошо погуглив нашел более универсальное средство. Программу DataCol.

  45. Алексей says:

    Спарсил таблицу, в ней внешние ссылки, на чужой сайт, помогите сделать ред директ со скрытием ссылки, перехват страницы при нажатии на ссылку, парсинг ее (там разные ссылки) и вывод в определенном месте. у меня все на dle

    1. Вячеслав says:

      Вам нужны 2 парсера, первый парсит таблицу, второй будет парсить данные по ссылкам из этой таблицы.
      В первом парсере, вы должны преобразовать внешние ссылки:

      $content = str_replace('http://чужой_домен/','http://cвой_домен/url.php?id=', $content);

      Итак, у нас в таблице парсера N1 теперь появились ссылки ведущие на парсер N2 и передающие в переменной id часть ссылки, с которой будет он парсить.

      В url.php (парсер №2) перехватываем переменную id:

      $fullurl="http://чужой_домен/" .$_GET["id"]; //получили в переменную $fullurl полный урл страницы с которого будем вырезать информацию

      А далее стандартный код нашего парсера:

      Надеюсь, все понятно объяснил!

      1. Алексей says:

        первый пункт сделал, ссылки изменились.

        создал урл.пхп залипил его в шаблон все отображает на сайте, но только если в этом файле указать конкретно страницу. немного не понятно потому что каждый день в таблице разные ссылки
        сайт/online/111111.html потом сайт/online/22222.html как сделать так что бы в строке $content = file_get_contents('полный урл страницы с http:// с которого будем вырезать информацию'); указывалась страница с неизвестным именем например сайт/online/{url} или {name}.html и вообще не понятна зачем эта строчка когда есть вот эта $fullurl="http://чужой_домен/" .$_GET["id"]; она же обратно меняет мой домен на чужой? и парсит не хватает только кончания ссылки я так понял а строчку с полным доменом наверно же убрать можно будет?

        1. Вячеслав says:

          Я, честно говоря, ничего не понял из-того что вы написали.
          Если каждый день в таблице разные ссылки, то ссылки мы же не меняем!!! В парсере 1, мы вырезаем чужой домен (не ссылку целиком, а лишь домен из ссылки), а в парсере 2 - вставляем чужом домен к оставшейся части ссылки, которую передали по id.

          В парсере N2, откуда парсить, будет выглядеть так:

          $content = file_get_contents($fullurl);
          1. Алексей says:

            Дружище, как и обещал, разместил на сайте http://liasport.ru ссылку на твой блог. в самом низу "помощь в разработке"! если надо текст поменять скажи! ты меня реально выручил, надеюсь что и в будущем не откажешься от помощи!

            1. Вячеслав Скоблей says:

              Спасибо. Приятно!

              1. Алексей says:

                Привет, не подскажешь, а можно ли сделать после всех махинаций , когда домен получается вида http://МОЙ ДОМЕН/url.php?id=category/4/ сделать ссылку ЧПУ. пробывал через .htacces не получилось

                1. Вячеслав Скоблей says:

                  Изменить ссылку через htacces еще ничего не значит. Сама ссылка должна работать по ЧПУ - а это уже на уровне скрипта.

                  1. Алексей says:

                    раньше все парсилось с одного сайта но в один день стало Warning: file_get_contents(): Couldn't resolve host name in
                    менял на www и тд не помогает, а если айпи сайта прописываю то нормально , означает что это защиту сделали? или как то можно обойти?

                    1. Вячеслав Скоблей says:

                      Эта ошибка говорит вам, что компьютер не может найти сайт, который вызывается в file_get_contents.
                      Скорее всего, вы или слишком часто обращаетесь к удаленному сайту (на нем срабатывает защита), либо ваш ip заблокировали вручную.
                      Полученные данные по file_get_contents хоть кешировались на Вашей стороне?

      2. Алексей says:

        помоги пожалуйста вырезать полностью тег например ... и все что у него внутри

        $content = str_replace('','', $content); через эту строчку не получается!

        1. Алексей says:

          ip сайта? я пробывал с другого домена...тоже ошибка, другие домены парсил все нормально..
          ну до этого все нормально было... а если добавили как обойти? и как скрыть что парсится сайт?

    2. Андрей says:

      скрипт работает, а вот iframe код который расположен в странице , помимо нужной информации, вырезается! как сделать что бы не вырезался? а вставлялся тоже ко мне на страницу?

      1. Вячеслав Скоблей says:

        Если iframe есть в исходном коде страницы, с который вы парсите информацию, то он должен попадать к вам на страницу!

  46. says:

    Вот я спарсил гороскоп

    от "Общий гороскоп на сегодня..." до "вставляем сюда завершающий код"

    как мне внутри текста добавить дугой код...который выводит рекламу? перед тегами

  47. Сергей says:

    Понятно когда требуется спарсить данные с одной страницы. Что делать когда есть необходимость парсить данные с 20-30 разных страниц одного сайта по одному наименованию и таких сайтов 10-15? Неужели писать такой код для каждой страницы каждого сайта? или можно как-то облегчить процесс?

  48. Николай says:

    доброго времени суток, а как мне сделать чтобы считывалась информация с ask.fm (лайки подари вопросы, определённого пользователя)

    1. Вячеслав says:

      У этого пользователя есть ведь своя персональная страница (уникальный урл)? Открываете исходный код и парсите нужные вам блоки. В статье ведь все написано!

  49. Александр says:

    выходит следующее:
    -вставляем сюда завершающий код

    1. Вячеслав says:

      Если вы больше ничего не видите (т.е. echo $content - пустое, значит неправильно настроили параметры: вырезать ОТ (//Определяем позицию строки, до которой нужно все отрезать) и ДО (//Точно таким же образом находим позицию конечной строки)!

  50. очень благодарен за данный код и за помощь в исправлении ошибок, а статья о кешировании вместе с кодом очень полезна http://seo-zona.ru/informer-kursa-valyut-svoimi-rukami-2014-08-03.html, результат кода с кешированием http://buda-koshelevo.net/afisha-kinoteatra-kryinitsa/ автору огромное спасибо!

  51. Артем says:

    Здравствуйте!

    А почему при обращении к парсеру у меня просто белая страница и все?

    1. Вячеслав says:

      Здравствуйте Артем! Пустая белая страница - это указание на то, что нарушен синтаксис кода. Проверьте, все ли кавычки, скобки и т.д. на своих местах в вашем коде?

      1. Артем says:

        Вячеслав,спасибо Вам за оперативный ответ!
        Мне конечно крайне не хотелось показаться тупеньким, тем более Вы написали "что это самая простая реализация парсера на php", да и по коментам видно,что проблем практически не возникает. Но тем не менее...
        При обращении к " http : // мой сайт / parser . php " , возникает вот это;

         17:30 аЂаАаНаКб€аЕаДаИ аŸаАаЛаМаЕб€аИ: ТЋа“б€бƒаПаПаА б€аОббаИаЙбаКаИб… аИ аКаИаПб€баКаИб… аИаНаВаЕбб‚аОб€аОаВ аПб€аИаОаБб€аЕаЛаА ТЋаŸаАб€аМбƒТЛ аЗаА 5 аМаИаЛаЛаИаОаНаОаВ аЕаВб€аОТЛ|53.......................................................................................................................................

        и так вся страница в спарсенном контенте! Подскажите пожалуйста, в чем ошибка?

        1. Вячеслав says:

          Здравствуйте еще раз! Ответ на ваш вопрос есть в статье: "Если наблюдаются иероглифы в спарсенном контенте, последнюю строчку в этом коде перезаписываем на что-то типа этого:

          echo iconv("windows-1251", "UTF-8", $content);

          Со значениями windows-1251 и UTF-8 играем, переставляя (зависит от начальных кодировок сайта донора и пациента)."

          1. Артем says:

            Вячеслав Здравствуйте!
            Спасибо за подсказку,но у меня не получается!
            "1| echo iconv("windows-1251", "UTF-8", $content);" нужно вместо " 25| ?> " или " 25| ?>echo iconv("windows-1251", "UTF-8", $content);"? И если у меня на спарсеной странице "кодировка ISO-8859-5",а у донора UTF-8, то мне нужно переставлять местами "ISO-8859-5" и "UTF-8"?

            1. Вячеслав says:

              Попробуйте так:

              echo iconv("ISO-8859-5", "UTF-8", $content);

              или

              echo iconv("UTF-8", "ISO-8859-5", $content);
  52. dima says:

    А можно ли как то указать в этой строке:
    ...

    $pos = strpos($content, 'здесь кусок кода/текста который размещен перед нужным текстом');

    ...

    div с конкретным классом или id ?

    1. Вячеслав says:

      dima, а почему нельзя? При его указании не работает парсер?

      1. dima says:

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

        1. dima says:

          ...* это тег айфрэйм

  53. Виктор Андреевич says:

    Заметил, что когда прописываю код

    $content = file_get_contents('http://мой сайт/parser.php');echo $content;

    слова заменяются, но когда --в том тексте, где нужно избежать кракозябель-- я вставляю этот код

    $content = file_get_contents('http://мой сайт/parser.php');echo iconv("windows-1251", "UTF-8", $content);

    слова, как по волшебству перестают заменяться на те, которые мне нужны!

    1. Вячеслав says:

      То есть, слова в парсере заменяются, если вызывать скрипт напрямую: мой сайт/parser.php ?

      А при перекодировке не вырезаются?

      1. Виктор Андреевич says:

        Не совсем Вас понял.
        В обоих случаях вызываю через панель wordpress. 
        В том случае, когда последняя строчка кода записана как: echo $content; - текст заменяется
        В том же случае, когда я записываю в последнюю строчку кода: echo iconv("windows-1251", "UTF-8", $content); - текст не изменяется.

        1. Вячеслав says:

          Скиньте мне ваш код в личку, удобным вам способом http://seo-zona.ru/contact
          Постараюсь подсказать где конфликт.
          Не забудьте указать сайт, на котором код вызывается.

  54. Виктор Андреевич says:

    Вячеслав, моей благодарности не предела) Благодарю!
    Но после этого в тексте перестали заменяться слова..
    Пытаюсь заменить ненужные слова на новые при помощи этой части Вашего кода:
    //если в тексте встречается текст, который нам не нужен, вырезаем его$content = str_replace('старый текст','новый текст', $content);

  55. Виктор Андреевич says:

    Вячеслав, хороший код. Но есть проблема. Вставляю его на сайт, работающий на wordpress 3.7. Вылазают иероглифы вместо нормальных букв. Я, по Вашей рекомендации в админке wordpress-а, в разделе страниц, заменяю последнюю строчку кода:

    $content = file_get_contents('http://мой сайт/parser.php');echo $content;

    на 

    $content = file_get_contents('http://мой сайт/parser.php');echo iconv("windows-1251", "UTF-8", $content);

    После этого спарсенный текст вообще не появляется..

    1. Вячеслав says:

      Виктор Андреевич, обратите внимание на кавычки (открывающие и закрывающие) в коде («windows-1251″). От этого код не будет срабатывать и вызывать ошибку.

      Вам сюда http://seo-zona.ru/10-veshhej-kotorye-ya-delayu-posle-ustanovki-wordpress-2013-11-18.html 5 пункт

  56. Виктор says:

    Спасибо автору! написано "живым" языком и доходчиво! Молодец, что тут сказать!

  57. Vlad says:

    Вещь хорошая, но яндекс не одобрит.

    1. Леха says:

      Еще как одобрит, бот он и в африке бот. Понятно что это не кнопка бабло, это один из ее элементов. Автору огромное спасибо _)

Добавить комментарий

Ваш адрес email не будет опубликован.