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 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 ...

Rails devise で複数モデルの認証機能を実装

Rails devise で複数モデルを管理 概要 rails のログイン認証 Gem「devise」のインストール・設定方法を紹介します。 よく「d...

jQuery UI ドラッグ&ドロップで並び替え sortableの使用方法

sortable 概要 jQuery UIを使用して、ドラッグ&ドロップで並び替えを行います。 sortableを使用することで、一瞬で実装できちゃいます...
トップへ戻る