Perlコーディング
インターネット上のファイル取得
2007年12月17日
Perlでは、外部ドメインのページを取得する関数がないので、処理を書かなければいけないようです。PHPでは内部も外部もfopenで取得できるのですが、Perlはそうはいかないようです。
URLからホスト名とファイルを分け、ソケットをオープンして接続して内容を取得しなければいけません。取得に成功したら、htmlの特殊文字をエスケープします。
呼び出し元
&gePage("取得したいURL")
サブ関数
sub getPage{
use Socket;
$url = shift @_;
my $host;
my $file_path;
$host = $url;
$host =~ s/http:\/\///g;
$host =~ s/https:\/\///g;
@domain = split(/\//, $host);
$file_path = $host;
$file_path =~ s/@domain[0]//g;
$host0 = @domain[0];
$port0 = getservbyname("http", "tcp");
$ipaddr = inet_aton($host0) or return "ホスト名検出エラー($host0)<br>\n";
$sock_addr = pack_sockaddr_in($port0, $ipaddr);
socket(SOCK, PF_INET, SOCK_STREAM, 0) or return "ソケット作成エラー($ipaddr / $port0)<br>\n";
connect(SOCK, $sock_addr) or return "サーバー接続エラー($ipaddr / $port0)<br>\n";
select(SOCK);
$|=1;
select(STDOUT);
print SOCK << "END_OF_DOC";
GET $file_path HTTP/1.0
Host:$host0
Connection:close
END_OF_DOC
while(<SOCK>){
last if m/^\r\n$/;
}
while(<SOCK>){
while(s/</</is){ };
while(s/>/>/is){ };
while(s/\r\n|\r|\n/<br>/is){ };
$page .= $_;
}
close SOCK;
# エスケープ
$page =~ s/&/&/g;
$page =~ s/"/"/g;
$page =~ s/</</g;
$page =~ s/>/>/g;
$page =~ s/<br>/\r\n/g;
$page =~ s/<br>/\r/g;
$page =~ s/<br>/\n/g;
return $page;
}
URLからホスト名とファイルを分け、ソケットをオープンして接続して内容を取得しなければいけません。取得に成功したら、htmlの特殊文字をエスケープします。
呼び出し元
&gePage("取得したいURL")
サブ関数
sub getPage{
use Socket;
$url = shift @_;
my $host;
my $file_path;
$host = $url;
$host =~ s/http:\/\///g;
$host =~ s/https:\/\///g;
@domain = split(/\//, $host);
$file_path = $host;
$file_path =~ s/@domain[0]//g;
$host0 = @domain[0];
$port0 = getservbyname("http", "tcp");
$ipaddr = inet_aton($host0) or return "ホスト名検出エラー($host0)<br>\n";
$sock_addr = pack_sockaddr_in($port0, $ipaddr);
socket(SOCK, PF_INET, SOCK_STREAM, 0) or return "ソケット作成エラー($ipaddr / $port0)<br>\n";
connect(SOCK, $sock_addr) or return "サーバー接続エラー($ipaddr / $port0)<br>\n";
select(SOCK);
$|=1;
select(STDOUT);
print SOCK << "END_OF_DOC";
GET $file_path HTTP/1.0
Host:$host0
Connection:close
END_OF_DOC
while(<SOCK>){
last if m/^\r\n$/;
}
while(<SOCK>){
while(s/</</is){ };
while(s/>/>/is){ };
while(s/\r\n|\r|\n/<br>/is){ };
$page .= $_;
}
close SOCK;
# エスケープ
$page =~ s/&/&/g;
$page =~ s/"/"/g;
$page =~ s/</</g;
$page =~ s/>/>/g;
$page =~ s/<br>/\r\n/g;
$page =~ s/<br>/\r/g;
$page =~ s/<br>/\n/g;
return $page;
}
コメント