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

3.87K
.
Ей 25
Screamer, ну форум я парсить не буду. И функция будет использоваться всегда на первой странице, и только раз.
Так что она вполне подходит.
.
(\/)____o_O____(\/)
ValekS, коды ответа сервера почитай, 200 это ок, 300 это редирект, 400 не существует, 500 ошибка сервера, 100 это продолжение, все есть в сети
.
Ей 25
Наконец закончил чудить нормальный, не быдлокодерский парсер библиотеки джонцмс.ком, в нём использовал все предложенные здесь коды\улучшения парсера - как писал Скример вынес запрос на добавление статей в БД за цикл(код Коенига помог, но всё же намучался я с этим), использовал код определения ай-ди со статьями(код Коенига), так же использовал код определения последней страницы постраничной навигации(код ЮА-95, мной доработанный).

В целом парсер получился стоящий. Но, код определения ай-ди со статьями захвачивает и ай-ди категорий. Так что приходится использовать проверку действительно это статья или нет.
Так же при написании и тестировании парсера я 3 или даже 4 раза положил ОпенСервер. Гг Причём все разы намертво - ни один сайт не открывался. Помогал перезапуск.
Так что сделал вывод - лучше парсить не всё сразу, особенно когда много статей\записей и т.д. а по кускам. Потому как если парсить всё сразу то долго ждать(если парсите 1000 статей то более 5 минут точно ждать будете), да и можно перегрузить хостинг или сервер. Так что парсите осторожно.
.
Ей 25
UA95 (01.07.2013 / 14:42)
Гг,продавать будет.
Та нет. Я думаю писать по нему статью или нет? Думаю что и комментариев хватит.
Особенно если прочитать уже написанные 2 статьи.
.
ValekS (01.07.2013 / 14:47)
Та нет. Я думаю писать по нему статью или нет? Думаю что и комментариев хватит.
Особенно если прочитать уже написанные 2 статьи.
Ели даш код, то начнется настоящий хаос как с ногомячом..тоесть все будут воровать один и тот же текст..и ситуевина осложнится еще и тем что время мона будет написать какое угодно..тоесть доказать что текст не украден станет очень проблематично. Если с грабеером мона справится, то парсер это зло..
.
ValekS, а так, я тя есть талант прям обьяснять все путно и правильно и понятно..пиши исчо..
.
Ей 25
Fublin, я пишу парсер для добрых намерений. Как там уже его будут использовать не моё дело. Главное что бы не присваивали себе авторство, как самого парсера так и спарсеных статей.
Сам же я всегда думал и думаю что на граберах и спарсеном контенте сайта не построишь. Файлы нужно заливать самому, статьи писать и добавлять самому. А не грабить и парсить.

Ну пока код кидать не буду. Если администрация не посчитает парсер "вредоносным" и мои действия тоже(написание парсера), то тогда выложу.
.
(\/)____o_O____(\/)
кидаю парсер как пример, спарсил почти 20к записей
mb_internal_encoding('UTF-8'); 

$db_host = 'localhost'; 
$db_user = 'root'; 
$db_pass = ''; 
$db_name = 'test'; 
$db_charset = 'utf-8';

include('koemysqli.php');
$mysqli = new KoeMysql($db_host, $db_user, $db_pass, $db_name, $db_charset);  



function kcurl($url, $post='', $mode=array()) {

$defaultmode = array('charset' => 'utf-8', 'ssl' => 1, 'cookie' => 0, 'headers' => 0, 'useragent' => 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.61'); 

foreach ($defaultmode as $k => $v) {
if (!isset($mode[$k]) ) {
$mode[$k] = $v;
}
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, $mode['headers']);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $mode['useragent']);
curl_setopt($ch, CURLOPT_ENCODING, $mode['charset']);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 200);

if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}

if ($mode['cookie']) {
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt');
}

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

if ($mode['ssl']) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
}

$data = curl_exec($ch);
curl_close($ch);
return $data;
}   

$data = kcurl('http://gts39.ru/rubric/'); 
preg_match_all('|<table cellspacing="0" cellpadding="0" border="0" class="main-section-list">(.*)</table>|sU', $data, $tab);
preg_match_all('|<a href="(.*)" title="(.*)">|isU', $tab[1][0], $names);

unset($names[0]);

$cnt = sizeof($names[1]);

$new_array = array();
$new_array2 = array();
for ($i=0; $i<$cnt; $i++) {
$new_array[] = $names[2][$i];
$new_array2[] = $names[1][$i];
}

for ($i2=0; $i2<$cnt; $i2++) {

$data_list = kcurl('http://gts39.ru' . $new_array2[$i2] . 'page/0/');     
preg_match_all('|<div class="firm-item">(.*)</td>|sU', $data_list, $tab);
preg_match_all('|<div(.*)">(.*)</div>|sU', $tab[0][0], $inf);

$array_list = $inf[2];
array_pop($array_list);
array_shift($array_list);

$cnt_list = sizeof($array_list);
$arr = range(3, $cnt_list, 4);

for($i3=0; $i3<$cnt_list; $i3++) {
if (in_array($i3, $arr)) {
unset($array_list[$i3]);    
}
}

$array_list = array_values($array_list);
$array_list = array_chunk($array_list, 3);

$cnt_list2 = sizeof($array_list); 

$arr_link = array();

for($i4=0; $i4<$cnt_list2; $i4++) {
$arr_link[$i4] = explode('|', preg_replace(array('#<a href="(.*)"#isU', '#( title="(.*)">(.*)</a>)#isU'), array('$1', '|$2'), $array_list[$i4][0]));
}

unset($array_list);

$cnt_list3 = sizeof($arr_link); 

for($i5=0; $i5<$cnt_list3; $i5++) { 

$data_info = kcurl('http://gts39.ru' . $arr_link[$i5][0]);   

preg_match_all('|<div class="firm-data">(.*)</a>|sU', $data_info, $tab2);

$array_info = explode('</div>', $tab2[1][0]);
if (preg_match('/http/i', $array_info[6])) {
$url = $array_info[6];    
} else {
$url = '';    
}

$new_array_info = array(trim(strip_tags($array_info[1])), trim(strip_tags($array_info[3])));
if (isset($url)) {
$url = trim(preg_replace(array('/<div><a target="_blank" rel="nofollow" href="/i', '/(">.*)/i'), '', $url));
}


$bd = array(mb_strtolower($new_array[$i2]), $arr_link[$i5][1], $new_array_info[0], $new_array_info[1], $url);
$sql = "insert into `spravka` (`cat`, `firm`, `adress`, `tel`, `site`) values (?, ?, ?, ?, ?)";  
$res = $mysqli->sql($sql, $bd);
unset($url);       
}

}
.
ValekS
Ей 25
# Koenig (17.08.2013 / 03:22)
кидаю парсер как пример, спарсил почти 20к записей
За один раз?
.
Koenig
(\/)____o_O____(\/)
ValekS, за раз, пришлось время выполнения скрипта побольше поставить
кому интересно то вот сайт http://gts39.ru/rubric/
Прикрепленные файлы:
Всего: 116