simplehtmldomを利用してCOOKPADのレシピを取得する

COOKPADのレシピを大量に取得する必要にせまられ簡単なスクリプトを組む。取得すべきレシピのIDがあらかじめ分かっていたために仕組みは非常に単純で、レシピ詳細ページのHTMLを丸ごと引っ張ってきて、該当の要素、ID、CLASS名を頼りにテキストを抽出するだけの内容。

当初、HTMLからの要素の抽出は正規表現の利用を考えていたのだけれど、予想に反して手間がかかりそうだったので「HTMLを扱うならjqueryのように出来ないかな」とスクリプトを探していたところPHP Simple HTML DOM Parserを見つけた。これはphpからHTMLをjqueryのように扱うためのライブラリで、書き方もjqueryに似ていてとても使いやすい。

もろもろの後に組み上がったコードを利用したサンプルがこちら(とりあえず動く程度のコードです)。cookpad.phpのgerRecipeに対してレシピのURLを入れると該当レシピの詳細を配列に入れて戻します。サンプルではそれをtextareaに出力したのみです。

使用するスクリプト

本スクリプト(index.phpおよびcookpad.php)については改変等を含めて全く自由に使っていただいて構いませんが、利用した事による不利益等につきましては一切責任を追うことは出来ません。また、当然ですがレシピの取得時にはCOOKPAD様のサーバーに対してアクセスを行いますので迷惑のかからぬようお願いいたします。

設置方法

/path/to/simplehtmldom/simple_html_dom.php
/path/to/cookpad.php
/path/to/index.php

index.php

[PHP]

* @version 1.00
* @date 2011/11/30
* Website: http://hirotomium.com/
*/

include(‘./simplehtmldom/simple_html_dom.php’);
include(‘./cookpad.php’);

define(‘COOKPADURL’, ‘http://cookpad.com/recipe/’);

//レシピID取得
$cid = isset($_POST[‘cid’]) ? htmlspecialchars($_POST[‘cid’]) : NULL;

if(is_numeric($cid)){
//URL生成
$url = COOKPADURL . $cid;

//レシピデータを取得
$recipe = getRecipe($url);

//整形ほか
if($recipe){
array_walk_recursive($recipe, ‘output’, &$data);
}else{
$data = ‘empty’;
}
}

function output($value, $key, &$data){
$data .= $value . “\n”;
}

//レシピID群(テスト用)
function getList(){
$data = array(
1565418,
1253530,
287215,
970996,
429430
);
return $data;
}
?>





クックパッドレシピ取得テスト

クックパッドからのレシピ取得スクリプト(サンプル)


クックパッドからレシピIDをキーとしてレシピの詳細データを取得します。

サンプル(





[/PHP]

cookpad.php

[PHP]

* @version 1.00
* @date 2011/11/30
* Website: http://hirotomium.com/
*/

function getRecipe($url = ”){
if(!isset($url)) exit;

$data = file_get_html($url);

if($data){
$out = array();

//ID
foreach($data->find(‘#recipe-title .f_right span.small’) as $element){
$out[‘id’][] = $element->plaintext;
}

//レシピ名
foreach($data->find(‘#recipe-title .f_right-title’) as $element){
$out[‘title’][] = $element->plaintext;
}

//作成者
foreach($data->find(‘#description’) as $element){
$out[‘author’][] = $element->find(‘div a’, 0) -> innertext;
}

//コメント
foreach($data->find(‘#description’) as $element){
$element->find(‘div’, 0) -> innertext = ”;
$out[‘description’][] = $element->plaintext;
}

//人数
foreach($data->find(‘span.servings_for’) as $element){
$out[‘servings’][] = $element->plaintext;
}

//材料
$ingredients = array();
$i = 0;
foreach($data->find(‘#ingredients_list’) as $element){
foreach($element->find(‘div.ingredient_row’) as $e){
$ingredients[$i][‘name’] = $e->find(‘.ingredient_name’, 0)->plaintext;
$ingredients[$i][‘quantity’] = $e->find(‘.ingredient_quantity’, 0)->plaintext;
$ingredients[$i][‘category’] = $e->find(‘.ingredient_category’, 0)->plaintext;
$i++;
}
}
$out[‘ingredients’] = $ingredients;

//手順
$instruction = array();
$i = 0;
foreach($data->find(‘.instruction’) as $element){
$instruction[$i][‘image’] = $element->find(‘img’, 0)->src;
$instruction[$i][‘text’] = $element->find(‘p.font14’, 0)->plaintext;
$i++;
}
$out[‘instruction’] = $instruction;

//コツ・ポイント
foreach($data->find(‘#advice’) as $element){
$out[‘advice’][] = $element->plaintext;
}

//行頭行末の半角スペースを除去
$out = recursiveFunc($out);

return $out;
}else{
return false;
}
}

function recursiveFunc($data){
$return = array();
foreach($data as $k => $v){
if(is_array($v)){
$v = recursiveFunc($v);
}else{
$v = preg_replace(“/(^\s+|\s+$)/”, ”, $v);
}
if(isset($v)) $return[$k] = $v;
}
return $return;
}
?>
[/PHP]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA