それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

セブンアンドワイの画像をISBNから取得する

Bk1の背表紙イメージをISBNから取得できたので、ついでにセブンアンドワイもやってみた。
セブンアンドワイはISBNから検索できるので、検索結果から商品IDを取得する

<?php
/***
 * セブンアンドワイの商品IDをISBNからLookUpする。
 *
 */
class Utena_SevenAndY {
  const server_enc = "euc-jp";
  protected $cache_dir;
  protected $cache_lite;
  public function __construct($cache_dir=null){
    require_once "Cache/Lite.php";
    if($cache_dir!=null){
      $this->cache_dir = $cache_dir;
    }else{
      $this->cache_dir = "/tmp/";
    }
    $this->cache_lite = new Cache_Lite( array("cacheDir"=>$this->cache_dir) );
  }
  protected function Scraping($isbn){
    $url = "http://www.7andy.jp/books/search_result"
          ."?kword_in=&kword_out=&title=&info=&writer="
          ."&publisher=&code=$isbn&ctgy=&publish_sy="
          ."&publish_sm=&publish_ey=&publish_em=&x=28"
          ."&y=17&sort=0&disp=0&extract=0&oop=on";
    $search = '/<input type="hidden" name="product_cd__1" value="([0-9]+)">/';
    $html = $this->httpReuest($url);
    preg_match($search, $html, $matches);
    $accd =  $matches[1];
    //このほかに、タイトルや価格を抜きたい・・
    // 7andYのHTMLはServletでできてるようだ
    //tableレイアウトでClassやIDが無いのでちょっと面倒かも
    return array($accd);
  }
  public function ItemLookUp($isbn){
    $data = $this->Scraping($isbn);
    $accd = $data[0];
    $img_prefix = substr($accd, -1, 1);
    $book->SmallImage->URL  = "http://img.7andy.jp/bks/images/m{$img_prefix}/{$accd}.JPG";
    $book->MediumImage->URL = "http://img.7andy.jp/bks/images/m{$img_prefix}/{$accd}.JPG";
    $book->LargeImage->URL  = "http://img.7andy.jp/bks/images/i{$img_prefix}/{$accd}.JPG";
    return $book;
  }
  public function httpReuest($url){
    $cache = $this->cache_lite->get($url);
    if($cache){
      return $cache;
    }
    require_once "HTTP/Client.php";
    $cli = new HTTP_Client();
    $header["UserAgent"] = "bookmacro.com/Spider (hatena_id=takuya_1st)";
    $header["UA-CPU"] = "x86";
    $header["Referer"] = "http://www.7andy.jp/books/search";
    $cli->get($url);
    $response = $cli->currentResponse();
    $html = $response["body"];
    $html = mb_convert_encoding($html, "utf-8", SevenAndY::server_enc);
    $this->cache_lite->save($html, $url);
    return $html;
  }
}
/////////////////////
//test
////////////////////
//
$seven_y = new Utena_SevenAndY("/tmp/7andY/");
$ret = $seven_y->ItemLookUp("4592142039");
var_dump($ret);

セブンアンドワイの場合Bk1ほど確実に情報が抜ける訳じゃないので、Webサービスとして無理矢理利用するのはちょっと無理かも。


Bk1セブンアンドワイとAmazonから画像を集めれば、自分のローカルコレクションが充実しました。

ただ、画像のサイズがAmazonとセブンアンドワイで大きく違うので、実際はImage関数でリサイズ処理している。