Рально ли сделать свой парсер статей?

Статус
В этой теме нельзя размещать новые ответы.
Принципи для небольшого сайта делал полуавтоматический парсер заходиш на свою страницу там с сайта выводяться заголовки и ссылки на страници нажимаеш добавить статья у тебя в базе.

Такой парсер пишеться максимум за час
небольшой пример кода:

Код для одного сайта чтобы можно было посмотреть как работает писал под ДЛЕ, работает с RegExp
 
  • Заблокирован
  • #22
В том то и дело, что мне не нужен rss-парсер, мне нужен парсер статей с обычных сайтов.

Ну, чтоб парсил вообще с любого сайта - это нереально, если только с опред. двигов.
 
Автор темы попросил в ПМ выслать готовый мод для ДЛЕ шоб грабить новости, выложил полностью с коментами

PHP:
<?php

function get_content($hostname, $path) //Функции загрузки страници с любого сайта
{
	$line = "";
	$fp = fsockopen($hostname, 80, $errno, $errstr, 30);
	if (!$fp) exit;
	else
	{
		$headers = "GET $path HTTP/1.1\r\n";
		$headers .= "Host: $hostname\r\n";
		$headers .= "Connection: Close\r\n\r\n";
		
		fwrite($fp, $headers);
		while (!feof($fp))
		{
			$line .= fgets($fp, 1024);
		}
		fclose($fp);
		return $line;
	}
}
function get_news_titles($page) //загрузка предпросмотра
{
	$text = get_content('newspoker.ru', '/page/'.$page.'/'); //получаем страничку с сайта
	
	$text = str_replace("\n", '', $text); //убираем переносы строк, чтобы регулярное выражение сработало
	$text = str_replace("\r", '', $text); //тоже самое
	preg_match_all('#<tr><td class=\"menu2\" ><span style=\"color\: \#999\;\">(.*?)\:<\/span> <span style=\"color\: \#444\;\"><a href=\"(.*?)\">(.*?)<\/a>#i', $text, $matches); // регулярное выражение которым мы получаем заголовок
	preg_match_all('#<tr><td ><p><div id=\\'."'".'.*?\\'."'".'>(.*?)<\/div><\/p><\/td><\/tr>#i', $text, $matches2); //регулярное выражение которым получаем текст
	//print_r($matches);
	
	$matches[0] = '';
	$matches[4] = $matches2[1];
	$i = 0;
	while($i < 15) //записуем все полученые значения
	{
		$return[$i][1] = $matches[1][$i];
		$return[$i][2] = $matches[2][$i]; //ссылка на полную новость
		$return[$i][3] = $matches[3][$i]; //заголовок
		$return[$i][4] = $matches[4][$i]; //короткая новость
		$i++;
	}
	return($return);
}
function get_news($url, $short_story) //предаеться функции ссылка на полную новость и уже полученая короткая
{
	preg_match('#http:\/\/newspoker\.ru\/([\S]*)\/([\S]*)\.html#i', $url, $matches); //разбираем адресс на 2 части url и подпапки
	$text = get_content('newspoker.ru', '/'.$matches[1].'/'.$matches[2].'.html'); //загружаем страницу
	$altern = $matches[2];
	//print_r($matches);
	$text = str_replace("\n", '', $text); 
	$text = str_replace("\r", '', $text);
	//print $text;
	preg_match('#<tr><td class="menu2" ><span style="color: \#999;">.*?<\/span><h1 style="font-size:18px;">(.*?)<\/h1><\/td><\/tr>[\s]*<tr><td class="menu2_bot">&nbsp;Автор: .*?<\/td><\/tr>[\s]*<tr><td ><p><a name="newsbegins"><\/a><div id=\\\'.*?\\\'>(.*?)<\/div><a name="newsends"><\/a>#i', $text, $matches1); //с помощью регулярного выражения забираем полную новость
	//print_r($matches1);
	$title = $matches1[1]; //заголовок
	$text = $matches1[2]; //текст
	$text = $text.'<br><br>Источник: newspoker.ru'; //дописываем к тексту источник чтобы потом сайт не ругался на меня
	global $db, $member_db; //подгружаем класс для БД
	$text =  str_replace("'", '\\\'', $text); //экранируем '
	$short_story =  str_replace("'", '\\\'', $short_story); //везде
	$title = str_replace("'", '\\\'', $title); //везде
	create_metatags($short_story.$text); //создаем метатеги
	$thistime = date ("Y-m-d H:i:s"); //берем текущее время
	$db->query("INSERT INTO " . PREFIX . "_post (date, autor, short_story, full_story, xfields, title, descr, keywords, category, alt_name, allow_comm, approve, allow_main, fixed, allow_rate, allow_br, votes, access, expires, symbol, flag) values ('$thistime', '$member_db[2]', '$short_story', '$text', '', '$title', '{$metatags['description']}', '{$metatags['keywords']}', '3', '{$altern}', '1', '1', '1', '0', '1', '1', '0', '', '0000-00-00', '', '1')"); // пишем все в бд
	
}
/*

*/
//насчет функций все
$action = $_GET[act]; 
if($action == 'add') //если событие добавить, тогда 
{
	if($_POST[url] and $_POST[short]) //получаем переданые данные
	{
		$short = str_replace("\\\"", '"', str_replace("\\'", "'", $_POST[short]));
		get_news($_POST[url], $short); // с помощью функции добавляем новость
		//print ();
		msg("info",$lang['addnews_ok'], 'Новость добавлена'); // выдаем сообщение
	}
	else
	{
		echo'no url'; //если данных нет ошибка
	}
}
else //если добавлять не надо то выдаем список новостей
{
	echoheader("", "");
	$cur = $_GET[page]; //получаем страницу
	
	if($cur=='') $cur = 1;
	
	while($p < 10) //создаем навигацию на 10 страниц
	{
		if($cur == $p+1)
		{
			
			$pages .= ($p+1).' ';
		}
		else
		{
			$pages .= "<a href='?mod=newsload&page=".($p+1)."'>".($p+1)."</a> ";
		}
		
		$p = $p + 1;
	}
	$titles = get_news_titles($cur); //получаем заголовки новосте
	foreach($titles as $key=>$value) //выводим все на экран
	{
		/*<form action=?mod=newsload&act=add method=post target=_blank><input type=hidden name=url value='".$titles[$key][2]."'><input type=hidden name=short value='".str_replace("'", "\\'", $titles[$key][4])."'><input type=submit value='Добавить'></form>*/
		$list .= "<tr><td valign=top><form action=?mod=newsload&act=add method=post><input type=hidden name=url value='".$titles[$key][2]."'><div style='display:none'><textarea cols='0' rows='0' name=short>".$titles[$key][4]."</textarea></div><input type=submit value='Добавить'></form></td><td><b>".$titles[$key][3]."</b><br>".$titles[$key][4]."</td></tr><tr><td background=\"engine/skins/images/mline.gif\" height=1 colspan=2></td></tr>";
		
	}
	//print_r($titles);
	echo <<<BOBR
	<div style="padding-top:5px;padding-bottom:2px;">
<table width="100%">
    <tr>
        <td width="4"><img src="engine/skins/images/tl_lo.gif" width="4" height="4" border="0"></td>
        <td background="engine/skins/images/tl_oo.gif"><img src="engine/skins/images/tl_oo.gif" width="1" height="4" border="0"></td>
        <td width="6"><img src="engine/skins/images/tl_ro.gif" width="6" height="4" border="0"></td>
    </tr>
    <tr>
        <td background="engine/skins/images/tl_lb.gif"><img src="engine/skins/images/tl_lb.gif" width="4" height="1" border="0"></td>
        <td style="padding:5px;" bgcolor="#FFFFFF">
<table width="100%">
    <tr>
        <td bgcolor="#EFEFEF" height="29" style="padding-left:10px;"><div class="navigation">Выбор новости</div></td>
    </tr>
</table>
<div class="unterline"></div>

<table width="100%">
  <tr>
   <td width=150>Добавить</td>
   <td>Предпросмотр</td>
  </tr>
	<tr><td colspan="2"><div class="hr_line"></div></td></tr>
	{$list}
	<tr><td colspan="2"><div class="hr_line"></div></td></tr>
  <tr><td colspan="2">{$pages}</td></tr>
</table>

</td>
        <td background="engine/skins/images/tl_rb.gif"><img src="engine/skins/images/tl_rb.gif" width="6" height="1" border="0"></td>
    </tr>
    <tr>
        <td><img src="engine/skins/images/tl_lu.gif" width="4" height="6" border="0"></td>
        <td background="engine/skins/images/tl_ub.gif"><img src="engine/skins/images/tl_ub.gif" width="1" height="6" border="0"></td>
        <td><img src="engine/skins/images/tl_ru.gif" width="6" height="6" border="0"></td>
    </tr>
</table>
</div>
BOBR;
echofooter();
}

?>
Написал коменты с этого сайта модуль работает спокойно, пробуйте
 
Большое спасибо, bumer3!
Буду теперь разбираться в твоем граббере, думаю так легче будет.
 
Я вот нашел програмку . Автор говорит, что можно грабить новости с любого сайта без rss, а также их публиковать на своих сайтах. Там видео есть, все разжевано. Вот только за публикацию автор денег просит. Но как парсилку можно использовать на ура.
 
bumer3, а что такое echo <<<BOBR и BOBR; ?

Добавлено через 2 минуты
Я вот нашел програмку *** скрытое содержание ***. Автор говорит, что можно грабить новости с любого сайта без rss, а также их публиковать на своих сайтах. Там видео есть, все разжевано. Вот только за публикацию автор денег просит. Но как парсилку можно использовать на ура.

Сорри, но там у автора есть замчательная программка, CSS Magic, ну очень удобная софтинка для быстрого редактирования CSS
 
bumer3, а что такое echo <<<BOBR и BOBR; ?


Другой способ ограничения строки - использовать синтаксис heredoc ("<<<"). После <<< необходимо предоставить идентификатор, затем строку, а затем - тот же идентификатор как закрывающую кавычку.

Закрывающий идентификатор обязан начинаться в первом столбце строчки. Используемый идентификатор также обязан следовать тем же правилам именования, что и все другие метки в PHP:
он может содержать только алфавитные символы, числа и символ подчёркивания и обязан начинаться с не-цифры или с символа подчёркивания.Предупреждение!

Важно отметить, что строчка с закрывающим идентификатором не содержит больше никаких символов, за исключением, возможно, точки с запятой (;). Это означает, что идентификатор не может вводится с отступом и что не может быть никаких пробельных символов и знаков табуляции до и после точки с запятой.

Самое, возможно, неприятное, что в конце строки не может быть также и символа carriage return ( \r), только form feed, AKA newline (\n). Поскольку Microsoft Windows использует последовательность \r\n как терминатор строки, ваш heredoc может не сработать, если вы запишете ваш скрипт в редакторе под Windows. Однако большинство программ-редакторов дают возможность сохранять ваши файлы с терминатором строк UNIX.


Heredoc текст ведёт себя так же, как строка в двойных кавычках. Это значит, что вам не нужно мнемонизировать кавычки в heredocs, но можно продолжать использовать коды-мнемоники, перечисленные выше. Переменные разворачиваются, но с комплексными переменными в heredoc нужно работать так же внимательно, как и со строками.Пример 6-2. Heredoc-пример строк в кавычках
PHP:
<?php
$str = <<<EOD
Пример строки,
захватывающей несколько строчек,
с использованием синтаксиса heredoc.
EOD;
/* Более сложный пример, с переменными. */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>


Примечание: поддержка heredoc была введена в PHP 4.
 
Недавно наткнулся на интересную програмку. Умеет парсить с любого сайта. Не обязательно по RSS. Умеет дергать и вычищать новости.

Может сразу публиковать на ваших сайтах, правда авторами эта возможность закрыта. Просят денег.

Там же есть клипы по работе с программой. Разобраться не трудно.

 
А что, больше готовых вариантов парсеров статей нету? Вроде тема не нова.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху