Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить LWP обойти все ссылки на сайте? Вопрос конечно децкий 
V
    Опции темы
trigger
Дата 20.9.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Вопрос конечно децкий.

Подскажите плз как заставить LWP собрать все ссылки сайту и собрать контент. 
в топиках - не понял ничего. 
Заранее кланяюсь.

PM MAIL WWW ICQ   Вверх
nitr
Дата 20.9.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



trigger, здесь поиск на форуме, уже слишком много отвечали на этот деццкий вопрос ;)


--------------------
PM   Вверх
trigger
Дата 20.9.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



про наличие поиска осведомлен я и написал что не понял ничиго.


PM MAIL WWW ICQ   Вверх
nitr
Дата 20.9.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



trigger, тогда ты просишь написать за тебя всё? smile
напиши чего ты не понял и в каком посте smile

Добавлено @ 15:55 
бедм выяснять и учить ;)


--------------------
PM   Вверх
trigger
Дата 20.9.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



приятно..... но писать за меня не надо smile хотя спасибо !


Скрипт ниже честно содрал - не работает  попытался разобраться как работает - понял только на уровне подсознания. Может есть и другие варианты!?

Я понимаю что модулю LWP дать адрес и он скачает страницу и всякие атрибуты.
Но я не понимаю как заставить его проверить наличие ссылок (документов) - тоесть пойти дальше по сайту , собрать это все воедино, и какими методами этого добиться.

выражение
my $base = 'http://www.someplace.com'; переменной присвоили адрес 
my %href = ($base => 1);  ниже мне совершенно непонятно - это толкает его дальше ?

Прошу прощения что не в цвете
=================================
то что нашел на форуме :
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Headers; 
my $base = 'http://www.someplace.com';
my %href = ($base => 1); # общее хранилище ссылок инициализируем начальным адресом
my $ua = LWP::UserAgent->new;
my ($res, $content);

# временный хеш для новых ссылок
my %new_href = (1 => 1);

# если есть хоть одна новая ссылка
while (scalar keys %new_href) {
    # они должны быть уже в %href smile
    %new_href = ();
    # проходим по хешу еще раз
    while (my($k, $v) = each %href) {
    # если сылка еще не посещалась
        if ($v) {
         $res = $ua->get($k);
         # если нормально получили документ
         if ($res->is_succes) {
                # обнуляем посещенную ссылку
                $href{$k} = 0;
                $content = $res->content;

                while ($content =~ /<a href=(["'])?($base.+)\1[\s>]/gi) {
                    # если такой ссылки еще нет
                    $new_href{$2} = 1 unless (exists($href{$2}));
                    # для проверки
                    print $2,"\n";
                }
         } else { print $res->status_line, "\n" }
      } # if
     } # while
     # складываем старый хеш и новый.
     %href = (%href, %new_href)
}
# выводим ключи хеша
print join "\n", keys %href;

===================

Это сообщение отредактировал(а) trigger - 20.9.2006, 17:12
PM MAIL WWW ICQ   Вверх
nitr
Дата 20.9.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



вот тут глянь smile))
тока комменты убери
http://forum.vingrad.ru/index.php?showtopi...st&p=815557

Код

#!/usr/bin/perl -w
use strict;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new; #новый экземпляр
my $content = $ua->get('http://forum.vingrad.ru/index.php?showforum=5')->content; #воть вся страничка тут ;)

my $hash;
$hash->{$_}++ while $content =~ m{<A[^>]*?HREF=["'](.+?)['"][^>]*?>.*?</A>}smig;

print join "\n", sort keys %$hash;


в общем.. много вариантов ;)


--------------------
PM   Вверх
Nab
Дата 20.9.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Так что не работает то в том примере что ты привел? 
Его проверял я, и человек которому я его сделал... все работает... но он собирает только ссылки, а не контент, Второе ссылки могут генерироваться JavaScript  поэтому по ним так просто не пройдешься... давай сайт на котором тестировал...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
trigger
Дата 20.9.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



nitr подставил выдает вот это:
Use of uninitialized value in hash element at C:\t\scripts\files\link_graber.pl line 9.

8:  my $hash;
9:  $hash->{$_}++ while $content =~ m{<A[^>]*?HREF=["'](.+?)['"][^>]*?>.*?</A>}smig; это проход по ссылкам  правильно понял?

сайт как пример использовал http://www.gpr.com.ua

Я начал изучать перл под личный проект и в процессе того как будет собираться инфа по сайтам будут встречаться разные ссылки и  поэтому хочу написать чтото простое, непривередливое и понятное (сам с себя улыбаюсь).

Добавлено @ 18:30 
Nab 
Can't locate object method "is_succes" via package "HTTP::Headers" (perhaps you forgot to load "HTTP::Headers"?) at (eval 19)[C:/usr/site/lib/HTTP/Message.pm:85] line 1.

это выдало в вашем  варианте подскажите в чем может быть проблема?
HTTP::Headers - как положено есть

Это сообщение отредактировал(а) trigger - 20.9.2006, 18:25
PM MAIL WWW ICQ   Вверх
Nab
Дата 20.9.2006, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



а какая версия перла то у вас?


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
trigger
Дата 20.9.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



5.6.1
PM MAIL WWW ICQ   Вверх
nitr
Дата 20.9.2006, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Код

#!/usr/bin/perl -w    
use strict;    
use LWP::UserAgent;    
my $ua = LWP::UserAgent->new; #новый экземпляр    
my $content = $ua->get('http://www.gpr.com.ua')->content; #воть вся страничка тут ;)    
my $hash;    
$hash->{"http://www.gpr.com.ua$1"}++ while $content =~ m{<A[^>]*?HREF=["'](.+?)['"][^>]*?>.*?</A>}smig;    
print join "\n", sort keys %$hash;

работаить

Добавлено @ 23:07 
хошь в массив их... к примеру посл. строку поменять на 
Код

my @urls = sort keys %$hash;



--------------------
PM   Вверх
Nab
Дата 21.9.2006, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Цитата(trigger @ 20.9.2006,  19:19)
5.6.1

В версии LWP::* которая идет с этим перлом реализован еще старый стиль, и запрос и ответ нужно создавать отдельно... 
Как его изменить смотрите как был сделан первый вариант diverd в том топике откуда  вы этот пример утянули.


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
trigger
Дата 21.9.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



nitr Огромное спасибо smile
если правильно понимаю :

Код


my $content = $ua->get('http://www.gpr.com.ua')->content; # тут забираем контент со страницы

my $hash;  #объявляем хеш  
$hash->{"http://www.gpr.com.ua$1"}++ while $content =~ m{<A[^>]*?HREF=["'](.+?)['"][^>]*?>.*?</A>}smig;    
# тут с помощью регулярки проходим по содержимому и если встречается 
#ссылка запихиваем ее в хеш только поясните пожалуйста 
#выражение {"http://www.gpr.com.ua$1"}++ на пальцах.

print join "\n", sort keys %$hash; # ну а тут вывод на печать ключи


данный пример проходит по ссылкам только на первой странице, получается теперь придеца взять каждый ключь объявленного хеша передать его как следующющий запрос и в ней собрать опять ссылки и там проверки на есть уже  или  нет такой ссылки - правильно мыслю ?

Добавлено @ 11:44 
Nab  спасибо понял 

Это сообщение отредактировал(а) trigger - 21.9.2006, 11:43
PM MAIL WWW ICQ   Вверх
nitr
Дата 21.9.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



да по всем ссылкам самому писать скрипт ;)

это несложно

{"http://www.gpr.com.ua$1"}++ добавляем в хеш smile , чтобы повтором не было
http://www.gpr.com.ua это для красоты ссылок ;)

Это сообщение отредактировал(а) nitr - 21.9.2006, 11:52


--------------------
PM   Вверх
trigger
Дата 21.9.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Огромное Вам спасибо 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.