Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Парсер web страниц


Автор: Nаtаshа 3.12.2011, 13:46
Доброго всем дня!Нужна ваша помощь, т.к. в перл я еще не разбираюсь.
Код

#!C:/perl/bin/perl -w


use Socket;

$host = "www.google.ru";
$port = "80";


$iaddr = inet_aton($host);
if(!$iaddr)
{
    print "ERROR\n";
    exit(1);
}

my $sock_name = sockaddr_in($port, $iaddr);  


...
my $body = "";
$body .= $_ while <CONN>;
close(CONN);
open(F1,">web-page.html");
print(F1 "$body");
#print "$body";
}



Собственно первый вопрос:
почему не работает c именем хоста mail.ru ( выдает bad request) или go.mail.ru/search_images?fr=mailru(вообще не работает)
Второй:
  как скачать всю страничку целиком. Т.е. выдернуть все ссылки на файлы и скачать их в папку res и заменить ссылки  в документе.
пробовала с помощью HTML::LinkExtor, но не помогло что-то(точнее я глупая).
Третий
 нужно выдернуть ссылки на другие страницы,и вывести их в STDOUT

Что бы не было лишних вопросов,программа должна быть написана с использование сокетов.(т.е. нужно реализовать протокол html самостоятельно).
Заранее спасибо
 

Автор: Pfailed 3.12.2011, 18:56
Цитата(Nаtаshа @  3.12.2011,  13:46 Найти цитируемый пост)
почему не работает c именем хоста mail.ru 

Потому что запрос неверный. Должно начинаться с "GET /PATH", где PATH путь к требуемуму документу от корня.
http://ru.wikipedia.org/wiki/HTTP#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0

Цитата(Nаtаshа @  3.12.2011,  13:46 Найти цитируемый пост)
выдернуть все ссылки на файлы

Цитата(Nаtаshа @  3.12.2011,  13:46 Найти цитируемый пост)
пробовала с помощью HTML::LinkExtor, но не помогло что-то

Как пробовали?

Автор: dixoNICH 4.12.2011, 13:02
протокол, наверно, не html, а http, всё же.

Автор: Nаtаshа 4.12.2011, 13:23
Цитата

Потому что запрос неверный. Должно начинаться с "GET /PATH", где PATH путь к требуемуму документу от корня.
http://ru.wikipedia.org/wiki/HTTP#.D0.A1.D....BE.D0.BB.D0.B0

Спасибо.

Код

#!C:/perl/bin/perl -w

use Socket;
use HTML::LinkExtor;
use Data::Dumper;
#use strict;

$host = "news.mail.ru" ; 
$path = "/politics/7504642/";
$port = "80";
$iaddr = inet_aton($host);
if(!$iaddr)
{
    print "ERROR\n";
    exit(1);
}


my $sock_name = sockaddr_in($port, $iaddr);   
#    or die "Couldn't convert $host into an Internet address: $!\n";

socket(CONN,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(CONN,$sock_name)
    or die "Couldn't' connect to $host: $!\n";
select(CONN); $|=1; #select(STDOUT);
print CONN "GET $path HTTP/1.1\n";
print CONN "Host: $host\n\n";
print CONN "User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5\n";
print CONN "Accept: text/html";

my $body = "";
$body .= $_ while <CONN>;  #читаем страничку
close(CONN);
$body =~ s/^.+?\n\r?\n\r?//s;
open(F1,">web-page.html"); #скачиваемая страничка
open(F2,">links.txt");  #сюда кладем ссылки
print(F1 "$body");
#print "$body";
my $parser = HTML::LinkExtor->new();
$parser->parse($body); 
my @links = $parser->links; 
print(F2 Dumper \@links); 




Список ссылок с тегами получем так:
Код

my $parser = HTML::LinkExtor->new();
$parser->parse($body); 
my @links = $parser->links; 
print(F2 Dumper \@links); 



Нужно собрать ссылки на другие страницы отдельно и вывести их. В странице их не менять.

А ссылки на файлы(картинки архивы css, js и т.д.) скачать в отдельную папочку и заменить ссылки на эти файлы в документе(страничке).
Сложность в том,что нужно скачивать эти файлы через сокет. С посыланием запросов через сокет.

Добавлено через 1 минуту и 19 секунд
Цитата(dixoNICH @  4.12.2011,  13:02 Найти цитируемый пост)
протокол, наверно, не html, а http, всё же.


Да, точно.Ошиблась!

Автор: Palatin 7.1.2012, 13:46
парсер ($page - ваша страница):

Код

use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new(); 
$tree->parse($page); 
$tree->eof();
my @tags = $r->look_down("_tag", "a");
my @refs = ();
while (@tags) {
    push @refs, $_->attr('href');
}


В массиве @refs - все ссылки

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)