如何在不使用Perl和LWP获取页面的情况下获取最终URL?

pla*_*etp 6 perl redirect lwp

我正在使用Perl的LWP 做一些网页抓取.我需要处理一组URL,其中一些可能会重定向(1次或更多次).

如何使用HEAD方法获取解析所有重定向的终极URL?

Ton*_*ler 12

如果您使用LWP :: UserAgent的全功能版本,则返回的响应是HTTP :: Response的实例,而HTTP :: Response的实例又具有HTTP :: Request的属性.请注意,这不是必然,你在你的组URL的原始URL创建相同的HTTP请求::,作为检索响应实例中的请求实例的方法的HTTP响应::文档中描述:

$ r->请求($ request)

这用于获取/设置请求属性.request属性是对引起此响应的请求的引用.它不必是传递给$ ua> request()方法的相同请求,因为它们之间可能存在重定向和授权重试.

获得请求对象后,可以使用uri方法获取URI.如果使用重定向,则URI是跟随重定向链的结果.

这是一个经过测试和验证的Perl脚本,它为您提供了所需内容:

#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;

my $ua;  # Instance of LWP::UserAgent
my $req; # Instance of (original) request
my $res; # Instance of HTTP::Response returned via request method

$ua = LWP::UserAgent->new;
$ua->agent("$0/0.1 " . $ua->agent);

$req = HTTP::Request->new(HEAD => 'http://www.ecu.edu/wllc');
$req->header('Accept' => 'text/html');

$res = $ua->request($req);

if ($res->is_success) {
    # Using double method invocation, prob. want to do testing of
    # whether res is defined.
    # This is inline version of
    # my $finalrequest = $res->request(); 
    # print "Final URL = " . $finalrequest->url() . "\n";
    print "Final URI = " . $res->request()->uri() . "\n";
} else {
    print "Error: " . $res->status_line . "\n";
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 8

perldoc LWP :: UserAgent中所述,默认是遵循重定向GETHEAD请求:

$ua = LWP::UserAgent->new( %options )

...
       KEY                     DEFAULT
       -----------             --------------------
       max_redirect            7
       ...
       requests_redirectable   ['GET', 'HEAD']

这是一个例子:

#!/usr/bin/perl

use strict; use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
$ua->show_progress(1);

my $response = $ua->head('http://unur.com/');

if ( $response->is_success ) {
    print $response->request->uri->as_string, "\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

** HEAD http://unur.com/ ==> 301 Moved Permanently (1s)
** HEAD http://www.unur.com/ ==> 200 OK
http://www.unur.com/

  • @Tony,序列来自`$ ua-> show_progress(1);` (2认同)