Лекции     Книги     Рефераты    

Пишем простейший ПАРСЕР контента на PHP

news date мая.08.2008    categories Web-программирование > PHP    comments (9)

Предлагаю написать простейший парсер (программу, которая будет извлекать контент с удаленного сайта и выводить на нашей странице). В качестве “жертвы” выберем новости от yandex.ru – нас интересует блок новостей “Главные новости” – от заголовка до разделительной линии (элемент <hr>). Заходим на сайт и анализируем HTML-код. Находим в нем уникальные строки, по которым мы определим – ОТ какого участка кода и ДО какого мы будем отбирать нужный нам контент.
Находим в коде такой текст: “<h2>Главные новости</h2>” – пусть это будет начало блока… и текст “<hr>” (тег разделительной линии), которым наш новостной блок заканчивается…

Итак, сформулируем нашу задачу:

Нам необходимо: получить содержимое (текст) страницы, находящейся по адресу “http://news.yandex.ru/”, затем “отрезать” от полученного текста все, что находится ДО текста “<h2>Главные новости</h2>“, и все, что находится ПОСЛЕ текста “<hr>”. Полученный текст вывести в браузер.

Приступаем к выполнению…

<?php
/* получаем содержимое нужной нам страницы в переменную $content (обратите внимание, – мы используем для этого функцию file_get_contents. Она может работать с удаленными URL только если в настройках PHP установлена опция allow_url_fopen) */
$content = file_get_contents(‘http://news.yandex.ru/’);

// Определяем позицию строки, до которой нужно все отрезать (используем функцию strpos()).
$pos = strpos($content, ‘<h2>Главные новости</h2>’);

/*Отрезаем все, что идет до нужной нам позиции (функция substr в данном случае принимает два параметра: строка для обработки и //номер позиции. Функция вернет строку, НАЧИНАЯ с указанной позиции) */
$content = substr($content, $pos);

// Точно таким же образом находим позицию второй строки
$pos = strpos($content, ‘<hr>’);

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

// выводим полученную строку.
echo $content;
?>

Однако, давайте посмотрим на ссылки… Как видно, в исходном коде применяются относительные ссылки, следовательно, работать они у нас не будут… Давайте исправим положение. Нам необходимо после каждого “href=” добавить URL Яndexа. Тоесть нужно найти “href=” и заменить на ‘href=”http://www.yandex.ru/yandsearch?’. Для этого воспользуемся функцией замены строк: str_replace(). Функция принимает три обязательных параметра: “что найти“, “чем заменить“, и в какой исходной строке.

Добавим в наш скрипт перед выводом (тоесть перед командой “echo”) такой код:

$content = str_replace(‘href=”/yandsearch?’, ‘target=”_blank” href=”http://www.yandex.ru/yandsearch?’, $content);

Теперь ссылки ведут на сайт Яндекса…

Итак, мы написали простейший ПАРСЕР (скрипт “граббинга” контента). Давайте еще раз посмотрим, какие PHP функции были задействованы в коде:

  • file_get_contents – Получить содержимое файла в виде одной строки
  • strpos – Возвращает позицию первого вхождения подстроки
  • substr – возвращает подстроку строки string длиной length , начинающегося с start символа по счету.
  • str_replace – Заменяет строку поиска на строку замены

Попробуйте написать парсер для какого либо новостного сайта сами…
Не стесняемся задавать вопросы! :)

Обсуждения

9 комментариев к “Пишем простейший ПАРСЕР контента на PHP”
  1.   FTP сессия средствами PHP. by Онлайн - школа вебмастеров пишет:

    [...] предлагаю объеденить этот урок с предыдущим ("Пишем простейший ПАРСЕР контента на PHP") и написать сценарий, который будет парсить [...]

  2. 721113 пишет:

    Вот что смог, реализовать :)

    Успехов..

    “);

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

    // преобразовываем ссылку
    $content = str_replace(“href=\”/society/”, “href=\”http://novostey.com/society/”, $content);

    // преобразовываем изображение
    $content = str_replace(“src=\”/thumbs/”, “src=\”http://novostey.com/thumbs/”, $content);

    // создаем файл index.html
    $fps = fopen(“index.html”,”w+”);

    // записываем в index.html обработанную информацию
    fwrite($fps,$content);

    // закрываем файл index.html
    fclose($fps);

    // подключаемся к FTP

    // переменные для логина
    $ftphost = “ftp.narod.ru”;

    $user = “phpelse”;
    $password = “phpelse7″;

    // открываем FTP соединение, в случае неудачи останавливаем работу сценария
    $fp = ftp_connect($ftphost) or die (“Не могу соединиться c FTP сервером”);

    // логинимся
    $connect = ftp_login($fp, $user, $password);

    // проверяем успешность входа
    if($connect) echo “OK – мы вошли как $user “;
    else
    echo “Ошибка входа на FTP сервер”;

    ftp_pasv($fp, TRUE);

    $indexfile = fopen(“index.html”, “r”); // открываем нужный файл для чтения
    $loadfile = ftp_fput($fp, “index.html”, $indexfile, FTP_ASCII); // передаем его на FTP
    fclose($indexfile); // закрываем файл

    // закрываем FTP соединение
    ftp_close($fp);

    ?>

  3. 721113 пишет:

    Жаль что код не добавить, никак :(

    Урл на исходник что я написал.. http://phpelse.narod.ru/cod.txt

  4. GaaD пишет:

    Хм… что то не работает с яндекса :(

  5. admin пишет:

    Что имеено не работает? Пишите мне на email – посмотрим вместе…

  6. GaaD пишет:

    Вроде уже работает. Кажется апач както не так был настроен :)

  7. kr4shr пишет:

    Этот парсер уже не работает (главная страница новостей изменена)

  8. jigga пишет:

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

  9. Pavel_13 пишет:

    Привіт всім.
    jigga – поміняй лапки (‘) на (“) і в тебе все получиться.
    Вдячний Адміну за статейку. За корисну функцію file_get_contents().

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



Ваш комментарий:

 



© 2009 - 2010 | Webteach.ru | Образовательный портал