我正在做一些网页抓取 http://en.wikipedia.org/wiki/Web_scraping使用 Perl 的 LWP。我需要处理一组 URL,其中一些可能会重定向(一次或多次)。
如何使用 HEAD 方法获得解决所有重定向的最终 URL?
如果您使用全功能版本LWP::用户代理 http://search.cpan.org/%7Egaas/libwww-perl-5.834/lib/LWP/UserAgent.pm,那么返回的响应是一个实例HTTP::响应 http://search.cpan.org/%7Egaas/libwww-perl-5.834/lib/HTTP/Response.pm反过来又具有一个属性HTTP::请求 http://search.cpan.org/%7Egaas/libwww-perl-5.834/lib/HTTP/Request.pm。请注意,这是NOT必须与您使用 URL 集中的原始 URL 创建的 HTTP::Request 相同,如 HTTP::Response 文档中有关在响应实例中检索请求实例的方法中所述:
$r->请求( $请求 )
这用于获取/设置请求属性。请求属性是对引起此响应的请求的引用。它不必与传递给 $ua->request() 方法的请求相同,因为其间可能存在重定向和授权重试。
一旦获得了 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";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)