Да грядет продолжение!
Я снова с вами. Теперь, когда мы написали элементарный парсер записей блога, настало время его усовершенствовать. Чем мы и займёмся сегодня.
Тем кто не читал первую статью - Парсим записи блога, рекомендую её прочитать. Так вам будет понятней вся суть парсинга и код приводимый мной ниже.
Пишем парсер с использованием 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('"', '"', $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('"', '"', $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'); // инклюдим ноги