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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программа "умирает", через какое то время 
:(
    Опции темы
DEER
Дата 20.3.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



привет всем
вот тут я спрашивал , про закачку картинок, всё понял,
написал программку, суть её в следующем.

она заходит на страницу, ищет на ней список ссылок, этот список в массив $list_url{$deskription}=$url.

далее идёт цикл, просматриваются все элементы массива(хеша),
печатается описание к ссылке;
для каждого элемента вызывается следующий алоритм:
- получаем страницу по ссылке;
- там ищем ещё один список со ссылками;
- заходим по каждой ссылке, берём от туда картинку
- печатаем новый адрес картинки

в конце концов должно получится примерно следующее
Цитата

категория1
  1.jpg
  2.ipg
категория2
  3.jpg
категория3
  4.jpg
  5.jpg
  6.jpg

...и так далее до конца хеша %list_url


вроде всё работает.
но на практике, ссылок оказалось очень много, и ещё я поставил перед каждым запросом sleep(2), чтобы не нагружала сервак, откуда качаю. Время работы программы должно быть примерно часа 4(это я оценив, скока он скачал за 10 минут прикинул).
Через час работы программы, получается следующий список
Цитата

категория1
  1.jpg
  2.ipg
категория2
  3.jpg
категория3
категория4
категория5
категория6
...и так далее до конца хеша %list_url

т.е. программа, не заходит в процедуру получения картинок, а просто печатает хеш до конца и выключается.

Так вот вопрос: из за чего это может быть?
проблема в серваке? может там стоит какая нить константа, показывающая сколько максимально по впемени может работать скрипт?
или проблемма в программе? или может я сильно часто делаю запросы на страницу?
Щас ещё одна мысль пришла... а может это админ того сайта, откуда я картинки беру отрубил моё соединение?





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


Эксперт
****


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

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



Покажи немного кода smile где у тебя со слипами


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


Опытный
**


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

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



ну например вот:
Код

#закачивает картинку
sub get_pict
{
    my $art = shift; # имя картинки
    my $res;
    my $numer = shift;  # kjrfkmyjt bvz rfhnbyrb
    my $ua = LWP::UserAgent->new();
    $ua->timeout(5);
    $ua->agent( "Mozilla/5.0" );
        my $url = "$server/photo/$art.jpg";
        sleep(2);
        my $document = $ua->request( HTTP::Request->new( GET => $url ) );
    my $tmp = $document->content;
    if(($tmp=~/<html>/i)||($tmp=~/<HTML>/))  # если вернулясь не страница ошибки веб-сервера
    {
     $res = "";
    }
    else # то это картинка
    {
        open( FILE, ">$numer.jpg" );
        binmode( FILE );
        print FILE $tmp;
        close( FILE );
        $res = "$numer.jpg";
    }
    return $res;
}
#находит на странице список ссылок
sub get_child_categories
{
    my $url = shift; # урл станицы
    my %res = qw();
    my $ua = LWP::UserAgent->new();
    $ua->timeout(5);
    $ua->agent( "Mozilla/5.0" );
        sleep(2);
    my $document = $ua->request( HTTP::Request->new( GET => $url ) );
    my $the_dump = $document->content;
    $the_dump=~s/\n/ /g;
         # если есть участок кода, то берём из него данные и засовываем в хеш
    while($the_dump=~/<TD\s+width=\"350\"\s+valign=\"middle\"\s+height=\"18\"\s+colspan=2><A\s+href=\"\.(\/index.php\?menu_id=\d*\&step=\d*&type_id=\d*\&subtype_id=\d*)\">([^<]*)/g)
    {
        $res{$server.$1} = $2;
    }
    return %res;
}


сначала вызывается get_child_categories, потм для каждого элемента, еще одна функция get_list, почти аналогичная get_child_categories (только регулярное выражение другое),
потом, вызывается фуекция get_pict, для того что нашла get_list.
Добавлено @ 17:41
ещё.
код рабочий, потому что перед тем как умереть, он успевает собрать около 900 картинок


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


Эксперт
****


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

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



Первое на что могу подумать это ПЛОХОЙ КОННЕКТ smile у тебя стоит $ua->timeout(5); smile Либо увеличивай, либо создай проверочную процедуру на хороший коннект к серваку откуда качаешь ссылки!
Добавлено @ 17:54
Ещё... при использовании прокси НЕОБХОДИМА такая процедура! (проверка на "быстрый" коннект или доступность). Используй стандартные сокеты, либо тот же LWP, возьми почитай про ошибки типа 500, 200 OK и т.д. smile Очень поможет в будущем. Модуль не посоветую, т.к. сам такие не встречал smile


--------------------
PM   Вверх
DEER
Дата 20.3.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а что есть $ua->timeout(5);

?
это он будет 5 секунд ждать до ответа, а потом если его нет, то не ждёт больше?
Добавлено @ 18:02
спасибо, буду копать


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


Эксперт
****


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

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



=) Это значит что ждать всего 5 секунд и дисконнект smile , чтобы не висеть smile По умолчанию 30. Лучше создай процедурку примерно так smile

Код

sub check_proxy
{
  my ($host, $port) = @_;
  $ch_proxy = IO::Socket::INET->new(PeerAddr=> $host, PeerPort=> $port, TimeOut => 10);
  return 0 unless $ch_proxy;
  $ch_proxy->close;
  return 1;
}



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


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



DEER, sleep вообще убери и попробуй вести лог:

Код

open STDERR, '>', 'myerr.log';

...

warn "Get page $url \n";

...

warn "Get image $image\n";




И отследить, где ошибка!

Попробуй fork для ускорения закачки! Я здесь приводил свой пример закачки страницы через прокси, можешь поискать!


smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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