Tuesday, August 5, 2008

[Chapter 20] Web automation - Perl cookbook

20.1 Truy xuất một URL từ một perl script

Vấn đề
Dùng một script để truy xuất đến một url

Giải pháp
Sử dụng hàm get từ module LWP::Simple.
use LWP::Simple$content = get($url)

Thảo luận
Hàm get trong LWP::SImple trả về undef nếu có lỗi, nên ta có thể kiểm tra lỗi như sau:

use LWP::Simple;
unless (defined ($content = get $url) ) {
die "could not get $url\n";
}

Tuy nhiên, với cách trên, ta không thể xác định được nguyên nhân gây lỗi. Để có được khả năng này cũng như một số xử lý tinh tế hơn, chúng ta cần dùng các module khác.Ví dụ 20.1 là một chương trình truy xuất một tài liệu từ xa. Nếu thất bại, chương trình sẽ xuất ra dòng trạng thái lỗi, ngược lại xuất ra tiêu đề của tài liệu và số byte có trong nội dung. Ở đây chúng ta sử dụng 3 module từ LWP và 1 module khác.

LWP::UserAgent
Module này tạo ra một trình duyệt ảo. Đối tượng trả về từ hàm new được dùng để tạo một request thực. Tên của trạm trình duyệt ảo được đặt là "Schimozilla/v9.14 Platinum" để webmaster thấy ganh tị khi họ kiểm tra file log. :))

HTTP::Request
Là đối tượng được trả về khi trạm người dùng (user agent) chạy request. Dùng để kiểm tra nội dung và lỗi.

URI::Heuristic
Module tí hon này sử dụng thuật toán đoán theo kiểu Netscape để mở rộng các URL chưa hoàn chỉnh. Ví dụ:
Đơn giản Đoán
perl http://www.perl.com/
www.oreilly.com http://www.oreilly.com/
ftp.funet.fi ftp://ftp.funet.fi/
/etc/passwd file:/etc/passwd

Mặc dù những địa chỉ này không phải là những url hợp lệ, Netscape cố đoán url chính xác của chúng. Hầu hết các browser khác cũng làm tương tự.
Source

#!usr/bin/perl# titlebytes - tim tieu de va kich thuoc cua tai lieu
use warnings;
use LWP:::UserAgent;

use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;
my $raw_url = shift or die "usage: $0 url\n";

my $url = URI::Heuristic::uf_urlstr($raw_url);
$ = 1; # flush dòng kế tiếp

printf "%s =>\n\t", $url;

my $ua = LWP::UserAgent->new();
$ua->agent("Schmozilla/v9.14 Platinum"); # đợi đi, thế nào cũng có
my $req = HTTP::Request->new(GET => $url);$req->referer("http://wizard.yellowbrick.oz"); # tung hoả mù cho các chương trình phân tích log
my $response = $ua->request($req);

if ( $response->is_error() ) {
printf " %\n", $response->status_line;
} else {
my $count;
my $byte;
my $content = $response->content();
$bytes = length $content;
$count = ($content =~ tr/\n/\n/);
printf "%s (%d lines,%d bytes)\n", $response->title(), $count, $byte;
}

Khi chạy, chương trình sẽ cho ra kết quả như sau:

% titlebytes http://www.tpj.com/

http://www.tpj.com/ =>
The Perl Journal (109 lines, 4530 bytes)

Xem thêm

Tài liệu CPAN về LWP::Simple, trang hướng dẫn của lwpcook đi kèm với LWP; tài liệu của các module LWP::UserAgent, HTTP::Request, HTTP::REsponse, URI::Heuristic, công thức 20.2.

No comments: