2012年4月20日金曜日

【php】ターミナルを使用してamazonからデータを収集・保存する

ブラウザでphpを開くのではなく、ターミナルからphpを実行し、amazonからデータを収集し、データベースに保存する。


環境
  • mac OSX lion
  • xampp mac os x版 1.7.3

php.iniの設定

amazonへのリクエストにServices_Amazonを用いる。そのため、php.iniのinclude_pathをあらかじめ修正しておく必要がある。

ブラウザでphpを開いた場合、参照するphp.iniは/Application/XAMPP/xamppfiles/etc/内のphp.iniである。しかし、ターミナルからphpを実行した場合、参照するphp.iniは/usr/etc/内のphp.iniになるらしい。

そこで、/usr/etc/php.iniに赤字部分を追加する。
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes:/usr/lib/php/pear"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"
;
; PHP's default setting for include_path is ".;/path/to/php/pear"
; http://php.net/include-path
include_path = ".:/php/includes:/usr/lib/php/pear"

include_pathはphpファイルをinclude(あるいはrequire)する際に参照するフォルダである。/usr/lib/php/pearにServices_Amazonに関するファイルがあるため、これを追加することで'/Services/Amazon.php'を呼び出すことが可能になる。

参照:phpbook - インクルードパスの設定


データベースへの接続

上述の設定を行えば、amazonから情報を取得することができる。取得した情報をデータベースに保存する際に、注意する点がある。

$link = mysql_connect('localhost', 'ユーザ名', 'パスワード');

これだとなぜかエラーが出るので、これを下のように修正する。

$link = mysql_connect('127.0.0.1', 'ユーザ名', 'パスワード');

参照:stackoverflow


ソースコード
 

/*
* amazon apiにリクエストを送信し書籍ランキング情報を取得
* 取得した情報をデータベースに格納
* 
*/

// Services_Amazonの呼び出し
require_once 'Services/Amazon.php';

// amazon apiリクエスト時に必要なデータ
define('ACCESSKEY_ID', 'アクセスキーID');
define('SECRET_ACCESSKEY', 'シークレットアクセスキー');
define('ASSOCIATE_ID', 'アソシエイトID');
define('ECS_VERSION','2009-03-31');
define('RESPONSE_GROUP','Small,Images,ItemAttributes,OfferSummary,Reviews');

// main実行プログラム
$nodelist = array(
 "business" => "466282",
 "finance" => "492054"
);

foreach($nodelist as $key => $val){
 for($i=1; $i<=3; $i++){
  $ret = getItemRankingData($val, $i);
  saveItemRankingData($ret);
 }
}

function getItemRankingData($browse_node,$page){

 $amazon = new Services_Amazon(ACCESSKEY_ID,SECRET_ACCESSKEY,ASSOCIATE_ID);
 $amazon->setLocale('JP');
 $options = array();
 $options['BrowseNode'] = $browse_node;
 $options['Sort'] = 'salesrank';
 $options['ResponseGroup'] = RESPONSE_GROUP;
 $options['ItemPage'] = $page;

 $ret = $amazon->ItemSearch('Books',$options);
 return $ret;
}

function saveItemRankingData($ret){
 
  $link = mysql_connect('127.0.0.1', 'ユーザ名', 'パスワード');
  if (!$link) {
   die('miss!'.mysql_error());
  }
  
  $db_selected = mysql_select_db('test', $link);
  if (!$db_selected){
   die('データベース選択失敗です。'.mysql_error());
  }
  
  print('testデータベースを選択しました。');
  
  mysql_set_charset('utf8');
  
  for($i=0; $i<10;$i++){
   $title = $ret['Item'][$i]['ItemAttributes']['Title']."¥n";
   $sql = "INSERT INTO title (title) VALUES ('.$title.')";
   $result_flag = mysql_query($sql);
   
   if (!$result_flag) {
    die('INSERTクエリーが失敗しました。'.mysql_error());
   }
  }
  
  $close_flag = mysql_close($link);
  
  if ($close_flag){
   print('success end');
  }
}

?>



0 件のコメント:

コメントを投稿