我正在做一些web scraping使用Perl的LWP。我需要處理一組網址,其中一些網址可能會重定向(1次或更多次)。如何在不使用Perl和LWP獲取頁面的情況下獲得最終的URL?
如何使用HEAD方法獲得解決所有重定向的最終URL?
我正在做一些web scraping使用Perl的LWP。我需要處理一組網址,其中一些網址可能會重定向(1次或更多次)。如何在不使用Perl和LWP獲取頁面的情況下獲得最終的URL?
如何使用HEAD方法獲得解決所有重定向的最終URL?
正如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/
絕對正確,但我認爲OP想要知道一旦所有重定向被遵循,URL實際上是什麼。 – 2010-03-18 15:03:24
@Tony謝謝你的領導。我沒有立即注意到,並且在接受答案後顯然發佈了一個示例腳本。 – 2010-03-18 15:28:00
Oooh,我沒有看到顯示整個序列的uri-> as_string方法。非常好。 – 2010-03-18 15:59:10
如果您可以使用的全功能版本,那麼返回的響應是HTTP::Response的實例,其又具有作爲屬性HTTP::Request。請注意,這是而不是必須與您在URL集中使用原始網址創建的HTTP :: Request相同,如響應實例中用於檢索請求實例的方法的HTTP :: Response文檔中所述:
$ R->請求($請求)
這用於獲取/設置的請求屬性。請求屬性是對引起此響應的請求的引用。它不必是傳遞給$ 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";
}
感謝您的詳細解釋。 – planetp 2010-03-18 15:09:43
這是http://stackoverflow.com/questions/2010366/how-can-愚弄的人i-find-the-final-url-after-all-redirections-in-perl – Ether 2010-03-18 19:48:37