Пишем парсер записей блога

3.86K
.
Блиносвёрт ?
ValekS (30.06.2013 / 08:21)
И тебе тоже напишу Спасибо! Гг
Будешь теперь что-то парсить?
ну, я сграбить кое-чего сегодня хотела а чего спарсить, пока не придумала, я ж этим раньше не занималась, а тут необходимость появилась
.
Ей 25
Kazzone-1x-net (30.06.2013 / 09:26)
Как можно сделать код рабочим?
$texts = str_replace(''', ''', $text[1]);
Что это вообще за символ - ' ? Где ты его выцепил? Это как я понимаю десятичный код какого то хтмл символа, но какого именно я так и не нашёл. Нету такого. Вот амперсанд - & - обозначается как & хтмл кодом и как & десятичным кодом.
Используют обычно хтмл код, а у тебя десятичный, плюс ещё какой то неизвестный. Так что не знаю я как сделать твой код рабочим.
.
Ей 25
MRAMOR (30.06.2013 / 10:18)
title это ж заголовки, а как запихнуть если так буде
Ну при парсере хеллтар.ру проще использовать заголовки, так как в них содержится название записи. Зачем ещё куда то лезть?
В твоём примере я не понял толком что ты хочешь сделать. Спарсить все новости что там выводятся? Если да, то как это сделать я как раз и хотел рассказать в следующей статье.
.
Ей 25
MRAMOR (30.06.2013 / 10:36)
да, новости хотел, тогда ждем
Там как бэ и не трудно. Сразу надо все ссылки на новости вырезать, затем засунуть их в массив и потом уже не ай-ди записей\новостей\статей перебирать а эти ссылки.
Так что можешь попробовать сам усовершенствовать данный парсер. Потом накатаешь статейку и выложишь, как я. Гг
.
ValekS, все не читал, но есть один момент
Название записи у нас содержится в диве - title, в нашем случае это - <div class="title"><b>Catch Box for Windows</b></div>. Но я не буду парсить Название от сюда, так как если внимательно посмотреть, то можно обнаружить что Название статьи содержится ещё в title - <title>Catch Box for Windows</title>, откуда его взять удобнее.

Текст в <title> может обрезаться
.
Ей 25
Screamer (30.06.2013 / 11:08)
Текст в <title> может обрезаться
Ну та кто да.
Но в том блоге который я парсил название записи в титле не обрезается. Тем более что там нет особо длинных Названий.
Конечно сайт сайту рознь, поэтому надо смотреть код сайта а не брать и кругом титл парсить.
.
ValekS
Ей 25
Kazzone-1x-net (30.06.2013 / 11:50)
Это не хеллтар. А этот знак вот -> '
Вот этот знак - ' - кавычка - обозначается как &apos; хтмл кодом и &#39; десятичным. Хотя может тот ноль, перед 39, и не влияет ни на что. Отображения кавычки десятичным кодом я не встречал.
Попробуй убрать ноль или заменить на &apos; , а вообще смотри что находится в коде того сайта который ты парсишь. Как там кавычка выводится то так её и заменяй.
.
Ей 25
Kazzone-1x-net (30.06.2013 / 11:57)
А как быть с джоновской библиотекой? Там статья если длинная, она делиться на страницы?
Ну да. Придётся мучиться с постраничкой. Даже пока не знаю как её можно так сказать обойти или что. Подумаю на досуге.
Хотя вот для второй статьи, которую я попробую в скором времени написать, тоже надо будет как-то придумать "обход" постранички. В ней я хочу описать как парсить к примеру новости, ссылки на которые выводятся списком, с возможной разбивкой по страницам. Так что жди.
.
Ей 25
UA95 (30.06.2013 / 12:21)
Получаешь количесво страниц,запускаешь цикл и текст со всех страниц пишишь в одну переменную.
Ну примерно так я и думал.
Как там текст в одну переменную писать? ТаК:
$a = 'text1';
$a .= 'text2';

Или так:
$a = 'text1';
$a = $a.'text2';

Блин, помню вроде первый вариант правильный. Хотя походу и второй должен работать.
.
Ей 25
Да грядет продолжение!

Я снова с вами. Теперь, когда мы написали элементарный парсер записей блога, настало время его усовершенствовать. Чем мы и займёмся сегодня.
Тем кто не читал первую статью - Парсим записи блога, рекомендую её прочитать. Так вам будет понятней вся суть парсинга и код приводимый мной ниже.

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

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

В общем виде использование библиотеки cURL сводиться к четырем пунктам:
1) Инициализация cURL c помощью функции curl_init.
2) Установка параметров текущему сеансу c помощью функции curl_setopt.
3) Получение кода страницы c помощью функции curl_exec.
$) Закрытие сеанса cURL c помощью функции curl_close.

Итак, сейчас мы будем внедрять cURL в наш код парсера, написанного в прошлой статье. Создадим для начала функцию, в который и будем получать данные сайта:
function get_contents($url) {
           return ;
    }


Начало, как говорится, положено. Как видите назвали мы нашу функцию get_contents. Теперь будем её заполнять. Для начала надо инициализировать саму библиотеку cURL. Делается это так:
$curl = curl_init();


Далее надо с помощью функции curl_setopt() установить параметры для нашего cURL сеанса. Самих параметров много, с ими всеми можете ознакомиться в описании функции curl_setopt(), мы же будем использовать только 3 самых основных параметра, правда в конце я добавлю ещё два.

Пишем параметры:
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);


Первый параметр - curlopt_url - это ссылка на страницу, на которую необходимо зайти, её мы будем передавать функции. В функции ссылку мы принимаем переменной $url котрую и пишем в параметре. Подробно объяснять устройство функции думаю не имеет смысла.
Второй параметр - curlopt_header - значение которого мы задали как 0 или false отвечает за вывод заголовков, перед кодом страницы. Они нам не нужны. Поэтому мы их отключаем. Хотя при их включении ничего плохого не произойдёт.
Третий параметр - curlopt_returntransfer - значение которого мы установили как 1 или true сообщает cURL библиотеке что нам нужно поместить код страницы в переменную а не вывести на экран.

По нашему плану использования cURL у нас осталось ещё два пункта, вот и они:
$data = curl_exec($curl);
curl_close($curl);


Это вывод кода страницы в переменную $data с помощью функции curl_exec(), и закрытие cURL сеанса.
Вот и всё. Осталось только дописать одну строку:
return $data;


Здесь мы указываем функции что она должна возвратить переменную $data.
Дальше весь код идентичный тому, который мы писали в первой статье, только получение кода страницы немного меняется:
было - $file = file_get_contents('http://helltar.ru/post-'.$i.'.html');
стало - $file = get_contents('http://helltar.ru/post-'.$i.'.html');
Теперь мы получаем с помощью нашей функции а не стандартной PHP функции.

Вот ещё приведу 2 параметра функции curl_setopt(), их можно и не использовать. Новсё же их использование приведёт только к лучшему:
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);    
curl_setopt($curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.15');


Тут мы устанавливаем максимально допустимое время(в секундах - 30 секунд) на подключение к запрашиваемой странице и юзер-агент, то есть браузер с какого зашли на сайт. Я для примера указал Оперу. Можно просто было написать что-то вроде “Parser Bot” и т.д.

Теперь Привожу весь код парсера, с комментариями:
define('_IN_JOHNCMS', 1); // указываем что файл относится к ДжонЦМС
require_once('../incfiles/core.php'); // инклюдим ядро двига
require_once('../incfiles/head.php'); // инклюдим шапку

function get_contents($url) { // функция получения кода сайта
    $curl = curl_init(); // стартуем сеанс cURL
    curl_setopt($curl, CURLOPT_URL, $url); // указываем параметр - ссылку на страницу
    curl_setopt($curl, CURLOPT_HEADER, 0); // указываем параметр - отключение заголовков
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // указываем параметр - взапись кода страницы в переменную
    
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); // не обязательный параметр - обрываем сеанс если через 30 секунд не достучались до страницы
    curl_setopt($curl, CURLOPT_USERAGENT, 'Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.15'); // не обязательный параметр - устанавливаем юзер-агент
    
    $data = curl_exec($curl); // заносим код страницы в переменную
    curl_close($curl); // закрываем сеанс

    return $data; // отдаём код страницы
    }

function title($var) { // функция получения названия записи      
   preg_match('/<title>(.*?)<\/title>/is', $var, $title); // вырезаем название записи из титла
   
   $titles = str_replace('&quot;', '"', $title['1']); // обрабатываем кавычки
   
   return $titles; // отдаём название
    }

function text($var) { // функция получения текста записи
   preg_match('/<div class=\"post\">(.*?)<div style=\"float:left\">/is', $var, $text); // вырезаем текст записи
   
   $texts = preg_replace('/<img(.*?)\/>/si','',$text['1']); // вырезаем из текста картинки
   $texts = preg_replace('/<a(.*?)<\/a>/si','',$texts); // вырезаем из текста ссылки
   $texts = str_replace('&quot;', '"', $texts); // обрабатываем кавчки
   $texts = strip_tags($texts); // вырезаем из текста все хтмл теги

   return $texts; // отдаём тест записи
    }

for ($i = 1; $i < 178; $i++) { // создаём цикл, 1 - ай-ди первой записи а 178 ай-ди последней увел. на единицу

$file = get_contents('http://helltar.ru/post-'.$i.'.html'); // получаем код страницы с записью

$title = title($file); // получаем название
$text = text($file); // получаем текст

if ($title && $text) { // проверка наличия названия и текста
mysql_query("INSERT INTO `lib` SET
               `refid` = '217ssss',
               `time` = '" . time() . "',
               `type` = 'bk',
               `name` = '" . mysql_real_escape_string(mb_substr(trim($title), 0, 100)) . "',
               `announce` = '" . mysql_real_escape_string(mb_substr(trim($text), 0, 100)) . "',
               `text` = '" . mysql_real_escape_string($text) . "',
               `avtor` = 'ValekS',
               `ip` = '0',
               `soft` = '1',
               `moder` = '1'
           "); // заносим статью в БД библиотеки
echo 'Пост '.$i.' - Готово!<br/>'; // выводим результат
} else { // если нет названия и текста записи
echo 'Пост '.$i.' - Eror!<br/>'; // выводим ошибку
}
  }

require_once('../incfiles/end.php'); // инклюдим ноги
Прикрепленные файлы:
Всего: 116