ishiducaの日記 このページをアンテナに追加 RSSフィード

2008-11-04

[][]価格.comの検索結果をJSON形式で表示するスクリプトを作ってみる 15:51 価格.comの検索結果をJSON形式で表示するスクリプトを作ってみる - ishiducaの日記 を含むブックマーク はてなブックマーク - 価格.comの検索結果をJSON形式で表示するスクリプトを作ってみる - ishiducaの日記 価格.comの検索結果をJSON形式で表示するスクリプトを作ってみる - ishiducaの日記 のブックマークコメント

文字コード変換の実践として、価格.comの検索結果を抜き出してJSON形式で出力するスクリプトをつくってみる。

概要は、こんな感じ。

  • スクリプト名は、仮に kakakudot.pl。
  • ターミナルから利用する場合 > perl kakakudot.pl 検索語彙
  • ブラウザから利用する場合 サーバー上のアドレス?検索語彙 例:http://ishiduca.jp/kakakudot.pl?竹林と美女
  • 上記のような方法でリクエストを送ると、JSON形式で商品リストが返ってくる。
  • http://kakaku.com/book_cd_dvd/ 価格.com - 本・CD・DVD の検索結果を利用する。
  • 20件以上は表示されないので、実用には向かない。

技術的な点で必要なこととか

  • 価格.com の検索では Shift_JIS でリクエストを送る必要があるので、utf-8 のリクエストを一度 Shift_JIS に変換して、価格.com に送る。
  • 返ってきた結果は Shift_JISHTML なので、必要な部分だけ正規表現で抜き出す。
  • 文字コードを utf-8 に直す。JSON形式にして出力する

kakakudot.pl

#!/usr/bin/perl

use strict;
use LWP::Simple;
use Encode;
use CGI;

my $uri = 'http://search.kakaku.com/ksearch/search.aspx'
    . '?category=0010&search.x=23&search.y=9&query=';

my $query = undef;
if( $ENV{'QUERY_STRING'} ){
        $query = $ENV{'QUERY_STRING'};
        $query =~ tr/+/ /;
        $query =~ s/%([a-fA-F0-9]{2})/pack('C', hex($1))/eg;
} else {
        $query = $ARGV[0];
}

my $enc_sjis = find_encoding('Shift_JIS');
my $enc_utf8 = find_encoding('utf-8');

$uri .= $enc_sjis->encode($enc_utf8->decode($query));
my $html = get($uri);

# 検索結果のHTMLから、解析するための正規表現
(my $Reg =<<'REG') =~ tr/\n//d;
<div class="leftBox">
.*?<img src="(.*?)".*?</div><div class="rightBox">
.*?URL=(.*?)".*?>(.*?)</A>
.*?<span class="price">(.*?)</span>
.*?<p class="details">(.*?)</p>
.*?<span class="storeName">(.*?)</span>
REG
;

# ここから表示の部分
print CGI::header('text/plain; charset=utf-8') if $ENV{'QUERY_STRING'};
my $c = 0;
print "[\n";
while( $html =~ m/$Reg/gs ){
        my $str = undef;
        $str .= ",\n" if $c > 0;
        $str .= "{\n"
            . "\t\"imgURL\"      : \"$1\",\n"
            . "\t\"htmlURL\"     : \"$2\",\n"
            . "\t\"title\"       : \"$3\",\n"
            . "\t\"price\"       : \"$4\",\n"
            . "\t\"description\" : \"" . &notag($5) . "\",\n"
            . "\t\"webshop\"     : \"$6\"\n}";
        print $enc_utf8->encode($enc_sjis->decode($str));
        $c++;
}
print "\n]";

sub notag{
        local $_ = shift;
        $_ =~ s/<.*?>//g;
        return $_;
}

実行してみる

> perl kakakudot.pl きつねのはなし

結果

[
{
	"imgURL"      : "http://ecx.images-amazon.com/images/I/41R2APX4E3L._SL160_.jpg",
	"htmlURL"     : "http://www.amazon.co.jp/dp/4104645028/?tag=kakakucom-ss-22&creative=380337&creativeASIN=4104645028&linkCode=asn",
	"title"       : "きつねのはなし",
	"price"       : "&yen;1,470",
	"description" : "著者&#58;森見登美彦ISBN&#58;9784104645022",
	"webshop"     : "Amazon"
},
{
	"imgURL"      : "http://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1046/10464502.jpg?_ex=128x128",
	"htmlURL"     : "http://hb.afl.rakuten.co.jp/hgc/040be769.42689f8e.040be76a.9510edc2/?pc=http%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F4143405%2F",
	"title"       : "きつねのはなし",
	"price"       : "&yen;1,470",
	"description" : "著者&#58;森見登美彦出版社&#58;新潮社サイズ&#58;単行本ページ数&#58;268p発行年月&#58;2006年10月この著者の新着メールを登録する今週の著者インタビューは森見登美彦さん。第15回日本ファンタジーノベル大賞受賞作『太陽の塔』でデビューした森見さんが...",
	"webshop"     : "楽天ブックス - 楽天市場"
},
{
	"imgURL"      : "http://a248.e.akamai.net/f/248/37952/7d/image.shopping.yahoo.co.jp/i/g/7andy_31794025",
	"htmlURL"     : "http://rd.store.yahoo.co.jp/7andy/31794025.html",
	"title"       : "きつねのはなし  /森見登美彦/著 [本]",
	"price"       : "&yen;1,470",
	"description" : "【セブン-イレブンで24時間受取りOK・送料0円!】著者/訳者名&#58;森見登美彦/著出版社名&#58;新潮社発行年月&#58;2006年10月関連キーワード&#58;キツネノハナシきつねのはなし、モリミ,トミヒコもりみ,とみひこ、シンチヨ...",
	"webshop"     : "セブンアンドワイ ヤフー店 - Yahoo!ショッピング"
},
{
	"imgURL"      : "http://image.books.livedoor.com/upload/image01/4/1/3001041-1.jpg",
	"htmlURL"     : "http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2327384&pid=875565628&vc_url=http://books.livedoor.com/item4104645028.html",
	"title"       : "きつねのはなし",
	"price"       : "&yen;1,470",
	"description" : "細長く薄気味悪い座敷に棲む狐面の男。闇と夜の狭間のような仄暗い空間で囁かれた奇妙な取引とは。『太陽の塔』の著者が紡ぐ、京の骨董屋をめぐる奇譚集。",
	"webshop"     : "livedoorブックス"
{
]

成功したっぽい。

実際には、これだけじゃ面白くも何ともないので、二次利用してこそ面白いんだと思います。あと、JSONじゃなくてRSS形式とかYAML形式でもいいんですが、それはまた。

otsuneotsune2008/11/04 13:15さらに
encode("utf-8", $html)

encode_utf8($html)
のほうが。

ishiducaishiduca2008/11/04 16:06ありがとうございます><

ishiducaishiduca2008/11/04 20:01JSON形式で出力したデータは、こんな感じで利用する。
http://ishiduca.sakura.ne.jp/doc/kakakudot.html

別に新しい事は何もないけど、まあ。

SialanSialan2012/11/01 21:21This is the percfet way to break down this information.

ytyoqgcytyoqgc2012/11/02 10:31WwhIl8 <a href="http://gaodiuhpidxj.com/">gaodiuhpidxj</a>

hwhjkkegaplhwhjkkegapl2012/11/02 15:03INGVWA , [url=http://jkhcdhoytizz.com/]jkhcdhoytizz[/url], [link=http://bjqoywtvimij.com/]bjqoywtvimij[/link], http://ilbzqbfywozx.com/

swkohnswkohn2012/11/04 23:42IaCvAU <a href="http://ryxbhqjtcdzd.com/">ryxbhqjtcdzd</a>

yhrprweyhrprwe2012/11/05 12:57XbVWkx , [url=http://jvseelphdmet.com/]jvseelphdmet[/url], [link=http://lvnpyyjiggzm.com/]lvnpyyjiggzm[/link], http://fhxoysrrjagh.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20081104