Как я могу получить содержимое следующей ссылки в WWW :: Mechanize?

Надеюсь, это мой последний вопрос. Я использую $ mech-> follow_link, чтобы попытаться загрузить файл. По какой-то причине, хотя сохраненный файл - это только страница, которую я впервые открыла, а не ссылка, по которой я хочу перейти. Правильно ли я должен скачивать файл по ссылке? Я не хочу использовать wget.

    #!/usr/bin/perl -w
    use strict;
    use LWP;
    use WWW::Mechanize;
    my $now_string = localtime;
    my $mech = WWW::Mechanize->new();
    my $filename = join(' ', split(/\W++/, $now_string, -1));
    $mech->credentials( '***********' , '************'); # if you do need to supply     server and realms use credentials like in [LWP doc][2]
$mech->get('http://datawww2.wxc.com/kml/echo/MESH_Max_180min/') or die "Error: failed to load the web page";
$mech->follow_link( url_regex => qr/MESH/i ) or die "Error: failed to download content";
$mech->save_content("$filename.kmz");

person shinjuo    schedule 07.07.2010    source источник


Ответы (3)


Шаги, чтобы попробовать

  1. Сначала распечатайте содержимое своего get, чтобы убедиться, что вы попадаете на действительную HTML-страницу.
  2. Убедитесь, что ссылка, по которой вы собираетесь, является третьей ссылкой с именем MESH (с учетом регистра?)
  3. Распечатайте содержимое вашего второго get
  4. Распечатайте имя файла, чтобы убедиться, что оно правильно сформировано
  5. Убедитесь, что файл был успешно создан

Дополнительный

  • Вам не нужно, если в любом случае - он сработает или умрет

Пример

#!/usr/bin/perl -w

use strict;
use WWW::Mechanize;

   sub main{
   
      my $url    =  qq(http://www.kmzlinks.com);
      my $dest   =  qq($ENV{HOME}/Desktop/destfile.kmz);
      
      my $mech   =  WWW::Mechanize->new(autocheck => 1);
      
      # if needed, pass your credentials before this call
      $mech->get($url);
      die "Couldn't fetch page" unless $mech->success;
      
      # find all the links that have urls to kmz files
      my @links  =  $mech->find_all_links( url_regex => qr/(?:\.|%2E)kmz$/i );
      
      foreach my $link (@links){               # (loop example)

         # use absolute URL path of the link to download file to destination
         $mech->get($link->url_abs, ':content_file' => $dest);
     
         last;                                 # only need one (for testing)
      }     
   }
   
   main();
person vol7ron    schedule 07.07.2010
comment
как распечатать содержимое? Я пытался напечатать $ mech- ›content (format =› 'text'); но похоже, что это не работает - person shinjuo; 07.07.2010
comment
Итак, я получаю новый файл, который кажется более правильным, но файл, который он загружает, не открывается в Google Earth, как должен. Файл представляет собой файл .kmz, который у меня теперь загружается (который я обновил в своем коде), но когда я пытаюсь открыть файл, он говорит, что он не может быть открыт. - person shinjuo; 08.07.2010
comment
вы можете использовать print $mech->response()->content(), print $mech->content() или даже print %{$mech->get($url)}. format=>'text' удалит HTML, а если это XML-документ, содержащий только элементы и атрибуты, он может удалить все. - person vol7ron; 08.07.2010
comment
ссылка, по которой он идет, не является страницей. просто ссылка для скачивания - person shinjuo; 08.07.2010
comment
Я думаю, проблема в том, что он пытается сохранить страницу загрузки, а теперь объект, на который она ссылается. Я могу ошибаться, но файлы, которые он загружает, не работают должным образом - person shinjuo; 08.07.2010
comment
попробуйте ручную загрузку. После $mech->get('http://datawww2.wxc.com/kml/echo/MESH_Max_180min/'); введите $mech->get($urlOfDynamicLink); print $mech->contents(); - person vol7ron; 08.07.2010
comment
Я использовал этот $ mech- ›get ('datawww2.wxc.com / kml / echo / MESH_Max_180min /); и он по-прежнему не работает. Это так, как вы хотели? - person shinjuo; 08.07.2010
comment
Хорошо, это должно быть print $ mech- ›content (); На этой ноте это набор перемешанных символов и несколько звуковых сигналов, чем заканчивается. Я полагаю, что это искаженные символы, потому что это файл .kmz, который похож на файл изображения - person shinjuo; 08.07.2010
comment
Я думаю, что это тот тип файла, который я пытаюсь загрузить. В любом случае, это просто для загрузки файла, а не для копирования и сохранения его содержимого? - person shinjuo; 08.07.2010
comment
$ mech- ›get () загружает файл, а затем вы хотите его где-нибудь сохранить. Файл .kmz - это закодированный файл KML. Вы можете использовать алгоритм ZIP 2.0 для его дефляции, т. Е. Открыть его с помощью Winzip после того, как вы его сохранили. - person vol7ron; 08.07.2010
comment
вы также можете сохранить файл за один шаг: $mech->get( 'http://datawww2.wxc.com/kml/echo/MESH_Max_180min/MESH_Max_180min_20100707-130536.kmz', ':content_file' => '20100707_130536.kmz' ); - person vol7ron; 08.07.2010
comment
Он не позволяет мне открыть его в winzip .... не уверен, в чем проблема. Мне нужен сайт, на котором все могут его увидеть, чтобы протестировать. - person shinjuo; 08.07.2010
comment
Это похоже на то, что кодировка другая, чем должна быть. - person shinjuo; 08.07.2010
comment
Я изменил ответ, чтобы дать вам рабочий пример, который должен работать. - person vol7ron; 08.07.2010
comment
Вау, это работает! Я немного изменил его, так что теперь он извлекает только один файл. БОЛЬШОЕ СПАСИБО! Я ценю вашу помощь - person shinjuo; 08.07.2010
comment
Я не подтверждаю безопасность или ее надежность, это всего лишь пример того, как она должна работать, barebones. Рад, что у тебя все получилось. - person vol7ron; 08.07.2010
comment
Безопасность не должна быть проблемой, так как я просто запускаю ее с помощью планировщика задач на рабочем столе своего компьютера. Его нет в сети, за исключением двух секунд, которые он выполняет. Есть ли в этом возможная проблема с безопасностью? - person shinjuo; 08.07.2010
comment
Всякий раз, когда происходит передача, возможны угрозы безопасности. Между клиентом и хостом есть пространство для различных методов проталкивания, но это совсем другая тема. Что вы делаете, у вас все будет в порядке, при условии, что контент поступает из надежного источника. - person vol7ron; 08.07.2010
comment
Да это оно. Сайт на самом деле просто каталог файлов - person shinjuo; 08.07.2010
comment
Я действительно ценю вашу помощь. я многому научился только у вас. Я изменил программу, чтобы она была только для одного файла, и сделал так, чтобы имя изменилось на дату / время. Это url_abs заставляет его работать по сравнению с тем, что было у меня? - person shinjuo; 08.07.2010
comment
Возможно, я не уверен, что у вас было раньше, и трудно увидеть, что делает страница, когда я не могу получить к ней доступ. Если URL-адреса имели относительные пути, то возможно. Кроме того, я думаю, что $mech будет пустым, если вы решите сохранить файл HTML с первым ->get(), используя :content_file=>. Есть много причин, по которым это могло не сработать. - person vol7ron; 08.07.2010

Вы уверены, что хотите, чтобы третья ссылка под названием «MESH»?

person Zaid    schedule 07.07.2010
comment
нет, я не осознавал этого, пока не вернулся и не посмотрел, что он ищет эту конкретную ссылку. Он по-прежнему не работает правильно, но это начало. Спасибо - person shinjuo; 07.07.2010

Измените if на unless.

person mcandre    schedule 07.07.2010
comment
Измените другой if на if. - person mcandre; 07.07.2010