Блог Ромки » Парсер своими руками. Теория
Дек
25

Парсер своими руками. Теория


0dc09226

Категория: Программируем

      Собственно, что такое парсер? Это скрипт/программа/куча текста, которая запрашивает страницу на другом сайте и берёт с него то, что нужно вебмастеру.

      Я ничего не читал по написанию парсеров и грабберов, додумался до этого способа сам, так что не критикуйте, если есть более лёгкий способ.
      Принцип моего способа довольно прост.

      Сначала получаем контент с нужного урл. Для этого я использую функцию:

1
$выход = file_get_contents('урл');

      Результат её выполнения - полный код необходимой страницы. Дальше - собственно и идёт мой принцип, а заключается он в том, что весь текст данной страницы помещается в php код и сразу коментируется. Поэтому, проанализировав выдачу кода, берём комбинации самого первого и самого последнего символов/тэгов (чаще всего это тэги html) и заменяем их на "начало php кода и начало коментрования" в начале и на "конец коментирования и конец php кода" в конце. Заменяется всё через такую функцию:

1
$выход = str_replace ('Что заменить', 'На что заменить', $вход);

      Пример кода для парсера:

1
2
$выход = str_replace ('<html>', '<'.'?'.'php '.'/*', $вход);
$выход = str_replace ('</html>', ' */ ?'.'>;', $вход);

      $выход - выходящий код, первый параметр - что заменять, второй - на что заменять, третий ($вход) - входящий код
      Обязательно надо разбить строку "" на несколько частей, так как интерпретатор может подумать, что это тэги, а не строки.
      Так как в качестве коментирования мы использую "/* */", то сначала уберём все знаки "*". Для этого используем код:

1
$выход = str_replace ('*', 'любой_символ', $вход);

      Итак, сейчас у нас есть полный код страницы, представленный как один большой комментарий в php коде. Дальше, если нам надо выделить какие-то строки разного строения, например все параметры товара в интернет-магазине, то анализируем код и пытаемся найти что-то, что их отличает друг от друга, причём отличия должны быть найдены как в начале каждого параметра товара, так и в конце. И при помощи замены необходимые части, которые нам нужны для вывода, должны быть присвоены каким-либо переменным. Например, если код будет таким:

1
2
3
<p><b>Название:</b> Название_товара<br />
<b>Размер:</b> Размер_товара<br />
<b>Вес:</b> Вес_товара</p>

      После всех замен должно получиться что-то подобное на такое:

1
<p> */ $name='Название_товара'; $razmer='Размер_товара'; $ves='Вес_товара'; /*

      Тут их отличает текст, который стоит до необходимого нам текста. Убираем переносы строк при помощи:

1
$выход = trim($вход);

       Получим:

1
<p><b>Название:</b> Название_товара<br /><b>Размер:</b> Размер_товара<br /><b> Вес:</b>Вес_товара</p>

Можно ещё пробелы убрать:

1
$выход = str_replace (' ', '', $вход);

      Ну и остаётся заменить "<b>Название:</b>" на "*/ $name='", "<br /><b>Размер:</b>" на "'; $razmer='" и т.д. Делается это кодом:

1
$выход = str_replace ("<b>Название:</b>", "*/ $"."name='", $вход);

      И так далее, замечу, что надо разделять на части переменные, которые должны получиться в коде.
Дальше мы записываем изменённый код страницы в файл с расширение .php и просто подгружаем его в скрипт. В результате по переменным, которым мы присвоили наши характеристики ($name, $razmer и $ves) будет доступно их значения.

1
2
3
4
$f=fopen("file.php","w");
fwrite($f,$переменная_с_кодом);
fclose($f);
include('file.php');

      Первая строчка открывает файл для записи. Вторая - записывает в файл наш изменённый код страницы. Третья - закрывает файл. И, наконец, четвёртая подгружает данный файл уже как php файл в наш скрипт. Дальше уже делаем с ними что угодно, например, выведем их на экран:

1
echo $name." - ".$razmer." - ".$ves;

      На экране будет

1
Название_товара - Размер_товара - Вес_товара

     Кто не совсем понял, что произошло, ещё раз чисто текстом. Сначала получаем код необходимой страницы, далее представляем его как php код, коментируем все строки. Потом по частям находим нужные нам куски кода и раскоментируем одновременно присваивая к каким-либо переменным, записываем наш php код в файл и сразу загружаем в скрипт в результате чего все переменные, которым мы присваивали нужные куски кода страницы, доступны из скрипта.
      Вот и всё, с теорией покончено, а попрактикуемся в следующей статье. Будем писать реальный парсер (:


14 коммент. к “Парсер своими руками. Теория”

  1. SeoTouch | Дек 25, 2021

    Хех, а можно было бы использовать DOM :)
    И на крайняк вырезать кусок текста и с ним работать)

  2. Ромка | Дек 25, 2021

    Ну я не говорил, что это самый лёгкий спосб =)
    Это один из способов (-:

  3. Seobucks | Дек 25, 2021

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

  4. Ромка | Дек 25, 2021

    Ну я ж говорю, чисто мой метод =)
    Насчёт регулярок – завтра опубликую статью про написание RSS читалки как раз с использованием регулярок.

  5. Semen | Дек 26, 2021

    Сам я не очень силен в программировании, но думаю ваш “не самый легкий способ” :) обязательно попробовать

    ЗЫ Вот про написание рсс читалки было бы интересно узнать

  6. Severus | Дек 26, 2021

    Хорошая статья,а так вообще решил покопаться в php )

  7. Ромка | Дек 26, 2021

    to Semen
    Не пробуйте)
    Регулярки самый лучший метод)))
    Сегодня опубликую rss читалку на регулярках.

  8. veligursky | Дек 26, 2021

    это не парсер а хз что, послушай SeoTouch, и юзай DOM – намного больше гибкости и больше пользы будет

  9. Ромка | Дек 26, 2021

    http://atoll-bio.ru/2009/12/pishem-rss-reader.html
    нормальный парсер rss =)
    а это…. не читайте больше)

  10. Stanislav | Дек 28, 2021

    Как то не логично, регулярки или dom попроще IMHO

  11. Solo | Янв 2, 2022

    регулярки проще, но не лучше

  12. Lisa | Янв 28, 2022

    А где же cURL ? )

  13. alex | Янв 31, 2022

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

  14. Владимир | Апр 16, 2022

    cURL + preg_match (_all) вот что нужно :) Одним file_get_contents Яшку не сграббить =)