LWP::UserAgentでメタタグにtwitter:cardが含まれていると正しく取得できない

2013/08/19

Yahooオークション商品詳細画面が取得できない

PerlのLWP::UserAgentを使用して、Yahooオークション商品詳細画面のHTMLを取得していました。
ですが、ある日から正しく全てを取得することができず、途中で途切れてしまうという現象が発生しました。
その対応した内容を掲載します。

元々のプログラムは以下のようになっていました。


use LWP::UserAgent;

print "Content-Type: text/html\n\n";

my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla');
my $res = $ua->get("YAHOO商品詳細画面のURL");
my $content = $res->content;

print $content;
exit;

LWP::UserAgentの6.05が不味い

6.05でメタタグにtwitter:cardのような設定があるとIllegalとして扱われるようです。
商品詳細画面を確認すると確かに上記のtwitter向けのタグが設定されていました。
まずは、以下のようにしてバージョンを確認します。


use LWP::UserAgent;
use Data::Dumper;

print "Content-Type: text/html\n\n";

my $ua = LWP::UserAgent->new;
print Dumper $ua;
$ua->agent('Mozilla');
my $res = $ua->get("YAHOO商品詳細画面のURL");
my $content = $res->content;

print $content;
exit;

以下が結果です。

$VAR1 = bless( { 'max_redirect' => 7, 'ssl_opts' => { 'verify_hostname' => 0 }, 'protocols_forbidden' => undef, 'show_progress' => undef, 'handlers' => { 'response_header' => bless( [ { 'owner' => 'LWP::UserAgent::parse_head', 'callback' => sub { "DUMMY" }, 'm_media_type' => 'html', 'line' => '/usr/local/share/perl5/LWP/UserAgent.pm:683' } ], 'HTTP::Config' ) }, 'no_proxy' => [], 'protocols_allowed' => undef, 'local_address' => undef, 'use_eval' => 1, 'requests_redirectable' => [ 'GET', 'HEAD' ], 'timeout' => 180, 'def_headers' => bless( { 'user-agent' => 'libwww-perl/6.05' }, 'HTTP::Headers' ), 'proxy' => {}, 'max_size' => undef }, 'LWP::UserAgent' );

バージョンが6.05です。

headerのX-Diedを見ることで、例外メッセージを知ることができます。


use LWP::UserAgent;
use Data::Dumper;

print "Content-Type: text/html\n\n";

my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla');
my $res = $ua->get("YAHOO商品詳細画面のURL");
my $content = $res->content;

print Dumper $res->header('X-Died');
print $content;
exit;

以下が結果です。

$VAR1 = 'Illegal field name \'X-Meta-Twitter:card\' at /usr/local/lib64/perl5/HTML/HeadParser.pm line 207.';

やはり、Illegalとして扱われています。

調べたとおり、ダウングレードしてみます。

libwww-perl-6.04から6.04のモジュールをダウンロードしてサーバーにアップし、以下のように読込みます。

use LWP::UserAgent 6.04;

上記のように設定することで今回は解決しました。
バージョンアップしてできなくなる処理があるとやっぱり困りますね。。。

  • このエントリーをはてなブックマークに追加
Related

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...

rbenv環境でRuby on Railsのアプリケーションを一瞬で自動生成

アプリケーション構築時に最初に行う手順 概要 アプリケーションを作成するまでの手順を記載しています。 rbenvなどの環境が設定済と仮定して話を進めま...

Rails devise・authority・rolifyで権限付きの認証機能

devise・authority・rolify 概要 3つのGemを使用して、権限付き認証機能を実装します。 gem インストール Gemfile ...
トップへ戻る