PDA

Просмотр полной версии : Грабилка новостей.


guest3297
01.11.2007, 20:10
Нужна грабилка новостей с секлаба, полюбому кто то заморачивался уже =) И др граб скрипт с It ресурсов.

Shred
01.11.2007, 20:18
киберсекурити раздайт новости с линками на свою пагу, как заюзать и пример парсинга хмл-ки на пхп тут (http://www.cybersecurity.ru/inform/index.php?phrase_id=398772)

guest3297
01.11.2007, 21:52
http://www.cybersecurity.ru/inform/1.php
Странная у них кодировка...

Еще варианты?

demonoid
01.11.2007, 22:18
#Мимо пробегал,мелкие наброски
#Почему то LWP::Simple наотрез отказался работать с секлабом , как выяснилось там проверка на валидность браузера

#!perl
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.8) Gecko/20071008 Firefox/2.0.0.8' );
my $response = $ua->get('http://www.securitylab.ru/');
my $res = $response->as_string;

my @t = $res =~m/<font class="smalltext">(.+)<\/font><\/div>/g;

foreach (@t)
{
printcyr( "$_ \n\n");
}

sub printcyr
{

my $text = shift;
$text =~ y/А-яЁё/\x80-\xaf\xe0-\xf1/;
print $text;
}
............

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

Программистам из компании SlySoft удалось взломать улучшенную систему защиты оп
ических дисков формата Blu-ray, известную под названием BD+ и до недавнего врем
ни считавшуюся абсолютно неуязвимой для хакерских атак.
............

guest3297
01.11.2007, 22:47
Надо на php

halkfild
01.11.2007, 23:04
тут utf8 http://www.cybersecurity.ru/inform/1.php
парсь пхп ну и переводи к нужной кодировке

если сильно нада, то позже сделаю грабер

guest3297
01.11.2007, 23:18
Надо сделай =)

NOmeR1
02.11.2007, 00:49
Не трудно получилось
<?
$seclab = file_get_contents('http://www.securitylab.ru/_Services/Export/RSS/news.php');
$seclab = str_replace('<title>SecurityLab.ru - Новости</title>', NULL, $seclab);
$seclab = str_replace('<description>Защита от нападения в сети</description>', NULL, $seclab);
preg_match_all('|<title>(.*)</title>|sU', $seclab, $titles, PREG_SET_ORDER);
preg_match_all('|<description>(.*)</description>|sU', $seclab, $contents, PREG_SET_ORDER);
for( $i = 0; $i < ((count($titles) + count($contents)) / 2); $i++ )
{
echo('Название новости: '.$titles[$i][1].'<br>');
echo('Новость: '.$contents[$i][0].'<br><hr><br>');
}
?>
Однако только главная страница.

halkfild
02.11.2007, 00:56
коряво но нормально парсит.. /*з.ы. исправлял старый скрипт.. мо сейчас отлажу и уберу лишнее*/


<?php
error_reporting(0);
$xmls="http://www.securitylab.ru/_Services/Export/RSS/news.php";

$news = array();
$currentNews = null;
$index = null;
function saxStartElement($parser,$name,$attrs)
{
global $currentNews,$index,$l,$type;

switch($name)
{
case 'channel':
$news = array();
break;
case 'item':
$currentNews = array();
break;
default:
$index = $name;
break;
};

}
function saxEndElement($parser,$name)
{
global $news,$currentNews,$index, $l,$type,$ii,$index;
$l[$name]=$currentNews[$name];
if ((is_array($currentNews) && ($name=='item')))
{
$news[] = $currentNews;
$currentNews = null;
};
$index = null;
$ii++;
}

function saxCharacterData($parser,$data)
{
global $currentNews,$index,$l;

if ((is_array($currentNews)) && ($index))
$currentNews[$index] = $data;

}

$parser = xml_parser_create();
xml_set_element_handler($parser,'saxStartElement', 'saxEndElement');
xml_set_character_data_handler($parser,'saxCharact erData');
xml_parser_set_option($parser,XML_OPTION_CASE_FOLD ING,false);
$xml = join('',file($xmls));
if (!xml_parse($parser,$xml,true)) die(sprintf('<div align=center><font size=2 face=verdana color=red>не прошел коннект</font></div>',
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
xml_parser_free($parser);

foreach($news as $n)
{
echo $n['title']." - ".$n['link']." - ".$n['description']." - ".$n['pubDate']."<br><br>";
}

?>


насчет преобразования с utf8-->cp1251 использовал раньше

function utf8tocyr($string) {
$result="";
for ($c = 0; $c < strLen($string); $c=$c+2) {
$ub = ord(subStr($string, $c, 1));
$lb = ord(subStr($string, $c+1, 1));

if ($ub == 208) {
if ($lb != 81) {
$result = $result.chr($lb + 48);
}
else {
$result = $result.'Ё';
}
}

if ($ub == 209) {
if ($lb != 91) {
$result = $result.chr($lb + 112);
}
else {
$result = $result.'ё';
}
}

if (($ub != 208) AND ($ub != 209) AND ($lb != 91) AND ($lb != 81)) {
$result = $result.chr($ub);
$c = $c-1; }
}
return $result;
}

NOmeR1
02.11.2007, 01:16
Попробуй тогда типо этого. только если бы знать, какая там кодировка стоит. У меня всё нормально отображается.
<?
$seclab = file_get_contents('http://www.securitylab.ru/_Services/Export/RSS/news.php');
$seclab = str_replace('<title>SecurityLab.ru - Новости</title>', NULL, $seclab);
$seclab = str_replace('<description>Защита от нападения в сети</description>', NULL, $seclab);
preg_match_all('|<title>(.*)</title>|sU', $seclab, $titles, PREG_SET_ORDER);
preg_match_all('|<description>(.*)</description>|sU', $seclab, $contents, PREG_SET_ORDER);
for( $i = 0; $i < ((count($titles) + count($contents)) / 2); $i++ )
{
echo('Название новости: '.iconv("UTF-8", "WINDOWS-1251", $titles[$i][1]).'<br>');
echo('Новость: '.iconv("UTF-8", "WINDOWS-1251", $contents[$i][0]).'<br><hr><br>');
}
?>
Если не заработает, попробуй поизменять "UTF-8" на "KOI8-R" или "KOI8-U" вобщем попробуй как-нибудь.

В http://www.cybersecurity.ru/inform/1.php кодировка UTF-8

nikoTM
02.11.2007, 02:26
На PHP.ru 440hz(А. Луговой..админ ихний) написал один оффигенный парсер..посмотрите там