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

4.48K
.
Ей 25
В SQL очепятка - `refid` = '217ssss',.
Эту сроку надо на `refid` = '1', заменить.
Это ай-ди категории библиотеки в которую заносим статьи.
Вот Перепаковал архив.
Прикрепленные файлы:
.
ValekS,
>file_get_contents()
>так же может быть отключена на хостинге
Ну функцию никто отключать не станет, а вот allow_url_fopen в конфиге могут отрубить. Точно не помню как эта опция называется, но помоему так.
.
Алсо, запросы в цикле не есть гуд.
Лучше одним выражением сразу в базу писать. INSERT INTO `lib` (FIELDS ...) VALUES ( ...
.
НУ вот и на свет вышел парсер!
.
Ей 25
Screamer, ну я пару раз сталкивался с тем что эта функция на некоторых хостингах не работала. Не знаю что там делали.

Запросы в цикле? Ну как бы да, это плохо. Потому как идёт на БД нагрузка, но как реализовать по другому? Я что-то этого из твоего поста так и не понял.
.
(\/)____o_O____(\/)
ValekS, заносить в массив нужное через цикл, далее уже полученный массив подставлять в values c помошью implode
.
ValekS
Ей 25
Koenig (30.06.2013 / 20:37)
ValekS, заносить в массив нужное через цикл, далее уже полученный массив подставлять в values c помошью implode
Примерный код можешь накидать? Это типо собирать массив со всеми статьями и уже потом заносить его в БД? Ну у нас три поля меняется - название, анонс и текст. Так что массив я ещё как-то составлю со всеми значениями, а вот в БД такой массив я не знаю как заносить.
.
Ей 25
Уже накатал код парсящий все статьи с библиотеки этого сайта(johncms.com). Код парсит всю статью, даже если она разбита на странички. Вот только обход постраничной навигации чуть кривой. Буду думать ещё. Да и перебор всех ай-ди статей занимает много времени. Надо тоже что-то думать.
.
ValekS
Ей 25
UA95 (30.06.2013 / 21:06)
Дый,айди перебирать действительно не гуд

Через часик напишу пример
Пример чего? Как не перебирать ай-ди? Или как не использовать запрос в цикле?
Может ещё подкинешь пример как лучше постраничку обойти? Хотя это у меня реализовано нормально, вот определение последней странички хромает. Есть идеи как её(последнюю страничку) узнать?
.
(\/)____o_O____(\/)
ValekS, как то так, не проверял на запись в базу
<?php

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; // отдаём тест записи
    }

$array = array();    
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) {
$array[] = array(1, time(), 'bk', 'ValekS', 0, 1, 1, "'" . mysql_real_escape_string(mb_substr(trim($title), 0, 100)) . "'", "'" . mysql_real_escape_string(mb_substr(trim($text), 0, 100)) . "'", "'" . mysql_real_escape_string($text) . "'");
echo 'Пост '.$i.' - Готово!<br/>'; // выводим результат 
} else { // если нет названия и текста записи
#echo 'Пост '.$i.' - Eror!<br/>'; // выводим ошибку
}
}


function mega_implode($array) {
return '(' . implode(', ' , $array) . ')';    
}
mysql_query("insert into `lib` 
(`refid`, `time`, `type`, `avtor`, `ip`, `soft`, `moder`, `name`, `announce`, `text`)
values
" . implode(', ', array_map('mega_implode', $array)) . ")");
require_once('../incfiles/end.php'); // инклюдим ноги 

?>
Всего: 116