8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl入学式Advent Calendar 2017

Day 4

Perl の LWP::UserAgent を使って遊ぼう!

Posted at

Perl には LWP::UserAgent と言って、ネット上にあるコンテンツへアクセスすることが可能になるモジュールが存在します。今回はこれの活用例を見ていきましょう。

cpanm をインストール済みの方は、次のコマンドをターミナルに入力してインストールしてください。

cpanm LWP::UserAgent

Ubuntu を使っていて、インストールができない場合は
https://qiita.com/tsig/items/cbfb7918c8d4bc56fb87
の記事を参考にするといいでしょう!

html を取ってくる💪

まずは html を取ってくるようなコードを書いてみましょう。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
 
my $ua = LWP::UserAgent->new;
 
my $response = $ua->get('http://example.com/');

die $response->status_line if !$response->is_success;

say $response->decoded_content;

http://example.com へアクセスして、成功すれば html を表示して、失敗すればその http のステータスコードを表示するといったコードです。

$response->content というのもありますが、基本的に $response->decoded_content を使うようにすると後から考えることが少なくて済みそうです。

とっても簡単!!

html をスクレイピングしてみましょう🐶

スクレイピングならおまかせの相棒を紹介します。HTML::TreeBuilder です。
先ほどのコードにちょこっと加えましょう。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
use HTML::TreeBuilder 5 -weak;
 
my $ua = LWP::UserAgent->new;
 
my $response = $ua->get('http://example.com/');

die $response->status_line if !$response->is_success;

my $html = $response->decoded_content;

my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof;

say $tree->look_down(_tag => 'h1')->as_text;

use HTML::TreeBuilder 5 -weak; はおまじないだと思ってください。これを書くことで $tree->delete() の過程が不要になります。詳しくはここ(英語)を参照してください。

実行結果は以下のように表示されるはずです!

Example Domain

13行のコードで、Yahoo!Japanのトピックス一覧を取得する!にも使い方が書いてますが、基本的に use HTML::TreeBuilder 5 -weak; を使うようにして $tree->delete() を書かないといったやり方のほうがシンプルになるのでオススメです!!

ファイルをダウンロードする👇

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use feature qw/say/;
use LWP::UserAgent;
use HTML::TreeBuilder 5 -weak;
 
my $ua = LWP::UserAgent->new;

my $file    = 'example.com.html';
my $response = $ua->get('http://example.com/', ':content_file' => $file);

die $response->status_line if !$response->is_success;

say "Download success";

正解した場合、実行結果は

Download success

と表示されて ls を入力すると example.com.html と表示されるはずです。
cat example.com.html とするとコンテンツが表示されるはずです!

今日はここまでです!
お疲れ様でした!!

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?