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

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

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アドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る