2010-03-18 28 views
5

Tôi đang thực hiện một số web scraping bằng LWP của Perl. Tôi cần xử lý một tập hợp các URL, một số URL có thể chuyển hướng (1 hoặc nhiều lần).Làm cách nào để có được URL cuối cùng mà không tìm nạp các trang bằng Perl và LWP?

Làm cách nào để có được URL cuối cùng với tất cả các chuyển hướng được giải quyết, sử dụng phương thức HEAD?

+0

Đây là một dupe của http://stackoverflow.com/questions/2010366/how-can- i-find-the-final-url-sau-tất cả-chuyển hướng-trong-perl – Ether

Trả lời

8

Như đã nêu trong perldoc LWP::UserAgent, mặc định là đi theo chuyển hướng cho GETHEAD yêu cầu:

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

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

Dưới đây là một ví dụ:

#!/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"; 
} 

Output:

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

Hoàn toàn chính xác, nhưng tôi nghĩ rằng OP muốn biết những gì các URL thực sự là một khi tất cả các chuyển hướng đã được theo sau. –

+0

@Tony Cảm ơn bạn đã đứng đầu. Tôi đã không nhận thấy nó ngay lập tức và đăng một kịch bản mẫu rõ ràng sau khi câu trả lời của bạn đã được chấp nhận. –

+0

Oooh, tôi không thấy phương thức uri-> as_string hiển thị toàn bộ chuỗi. Rất đẹp. –

11

Nếu bạn sử dụng phiên bản đầy đủ tính năng của LWP::UserAgent, thì câu trả lời được trả về là một thể hiện của HTTP::Response mà lần lượt có một thuộc tính là HTTP::Request. Lưu ý rằng đây là KHÔNG nhất thiết phải là cùng một HTTP :: Yêu cầu mà bạn đã tạo bằng URL gốc trong tập hợp URL của mình, như được mô tả trong tài liệu HTTP :: Response cho phương pháp truy xuất cá thể yêu cầu trong phiên bản phản hồi:

$ r-> yêu cầu ($ yêu cầu)

này được sử dụng để có được/thiết lập các thuộc tính yêu cầu. Thuộc tính yêu cầu là tham chiếu đến yêu cầu gây ra phản hồi này. Nó không phải là cùng một yêu cầu được chuyển đến phương thức $ ua-> request(), bởi vì có thể đã có chuyển hướng và ủy quyền thử lại ở giữa.

Khi bạn có đối tượng yêu cầu, bạn có thể sử dụng phương thức uri để tải URI. Nếu các chuyển hướng được sử dụng, URI là kết quả của việc theo chuỗi chuyển hướng.

Dưới đây là một kịch bản Perl, kiểm tra và xác minh, cung cấp cho bạn bộ xương của những gì bạn cần:

#!/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"; 
} 
+0

Cảm ơn bạn đã giải thích kỹ lưỡng. – planetp

Các vấn đề liên quan