Как прочитать содержимое веб-страницы, которое само по себе может быть перенаправлено на другой URL?

#perl

#perl

Вопрос:

Я использую этот код для чтения содержимого веб-страницы:

      my $ua = new LWP::UserAgent;                     
      my $response= $ua->post($url);

      if ($response->is_success){                 
      my $content = $response->content;
...
  

Но если $url указывает на перемещенную страницу, то $response->is_success возвращает false . Теперь, как мне легко получить содержимое перенаправленной страницы?

Ответ №1:

Вам нужно выполнить сам редирект.

 if ($response->is_redirect()) {
    $url = $response->header('Location');
    # goto try_again
}
  

Возможно, вы захотите поместить это в цикл while и использовать «next» вместо «goto». Вы также можете захотеть зарегистрировать его, ограничить количество перенаправлений, которые вы готовы выполнять, и т.д.

[обновить]

Хорошо, я только что заметил, что есть более простой способ сделать это. Со страницы руководства LWP::UserAgent:

$ua->requests_redirectable
$ua->requests_redirectable( @requests )
 Это считывает или задает список имен запросов объекта, который 
 "$ua-> redirect_ok(...)" разрешит перенаправление для. По умолчанию, 
 это "['GET', 'HEAD']", согласно RFC 2616. Изменить, чтобы включить
 'ОПУБЛИКОВАТЬ', рассмотрим:

 push @{ $ua->requests_redirectable }, 'ОПУБЛИКОВАТЬ';

Так что да, может быть, просто сделайте это. 🙂

Комментарии:

1. Похоже, запросы GET автоматически перенаправляются внутри. Итак, я делаю так: мой $ agent = LWP::UserAgent-> new(env_proxy => 1,keep_alive => 1, timeout => 30, agent => «Mozilla / 4.76 [en] (Win98; U)»); мой $ header = HTTP::Request ->создать(GET => $link); мой $request = HTTP::Request ->создать(‘GET’, $link, $header); мой $response = $agent-> запрос($request)

2. Да, но в вашем вопросе использовался POST , который вам нужно настроить (или обработать) вручную. В любом случае, рад, что у вас получилось.

3. Моя ошибка, мне нужно получить доступ только к веб-страницам (GET). Ну, этот общий способ работает как для GET, так и для POST.