我正在使用Perl的LWP做一些web scraping。我需要处理一组URL,其中一些可能会重定向(1次或更多次)。
如何使用HEAD方法获取解析了所有重定向的终极网址?
答案 0 :(得分:12)
如果您使用LWP::UserAgent的全功能版本,则返回的响应是HTTP::Response的实例,而HTTP::Request的属性又为{{3}}。请注意, NOT 必须与您在URL集合中使用原始URL创建的HTTP :: Request相同,如HTTP :: Response文档中所述,用于在其中检索请求实例的方法响应实例:
$ r-> request($ request)
这用于获取/设置请求属性。 request属性是对引起此响应的请求的引用。它不必是传递给$ ua> request()方法的相同请求,因为它们之间可能存在重定向和授权重试。
获得请求对象后,可以使用uri方法获取URI。如果使用重定向,则URI是跟踪重定向链的结果。
这是一个经过测试和验证的Perl脚本,它为您提供了所需内容:[/ p>
#!/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";
}
答案 1 :(得分:8)
正如perldoc LWP::UserAgent中所述,默认设置是遵循GET
和HEAD
请求的重定向:
$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";
}
输出:
** HEAD http://unur.com/ ==> 301 Moved Permanently (1s) ** HEAD http://www.unur.com/ ==> 200 OK http://www.unur.com/