DMMスクレイピング × WordPress
商品ページをWordpressの記事として登録
いよいよ最後の仕上げ!商品ページをスクレイピングしてWordpressの記事として登録しましょう。商品ページをスクレイピングするにあたり、一番大事なことは
・先に登録したカテゴリー(声優、俳優リスト)と商品の関連付け・重複登録を避けるために、ユニークな値を見つける
商品ページをスクレイピングするにあたり、おそらくサイトのどこかに商品コードのようなものはあるはずです。それを発見して、Wordpressのデータベースの構造を変更した点がありましたよね?
wp_postsテーブルにユニークvalフィールドを追加しましたね?
そこに商品コードのようなIDを見つけて登録すればうっかり重複登録をふせぐことが出来そうです。ではこちらのURLから商品リストを引っこ抜いてみます。
DMM.com [藍川あさ乃(あいかわあさの)] アニメ動画
パッケージ画像保存用のディレクトリ準備
DMMではアフィリエイトサイトを作る際、パッケージ画像の利用を許可しています。そこでスクレイピングした画像をついでに自分のサーバーに保存してあげます。そのためのディレクトリ準備です。商品ページをスクレイピングするPHPと同じ階層にDMMというディレクトリを作って、パーミッションを777にして設置します。準備は以上。後は以下PHPファイルを設置します。
post.php
以下は俳優、声優の商品URLから画像付でスクレイピングを実行します
これで準備はOKです。
先ほどのcategory.phpと同じ場所にpost.phpを設置し、アクセスしたら商品ページのスクレイピングが可能です。
post.php
// simple_html_dom.phpファイルの読み込み include_once('simplehtmldom_1_5/simple_html_dom.php'); //スクレイピングしたいURLを指定 require_once 'MDB2.php';//ライブラリのロード //DSN $db = "mysql://DBユーザー名:パスワード@localhost/データベース名?charset=utf8"; //接続 $mdb2 =& MDB2::factory($db); //スクレイピングしたいページのURL $act_url = 'http://www.dmm.com/digital/anime/-/list/=/article=actor/id=191268/view=text/'; /** **** 以下URLから俳優、声優のID番号を見つける処理(この場合だと191268を自働で取得する方法) **** **/ //URLを=イコールで分割する $act_url_explode = explode("=", $act_url); //explodeされると、$act_url_explode[3]に『191268/view』という文字列が入る。 //『/view』が邪魔なので/viewだけ削除やっとここで俳優、声優のIDが取得できる $act_id = str_replace ('/view', '', $act_url_explode[3]); /*ID取得はここまで*/ /** **** 以下取得したIDを元に、画像保存用にディレクトリを作る処理 **** **/ //俳優別に画像を保存したいので、取得したIDを元に./dmm/下にディレクトリを作る $newDir = './dmm/'.$act_id; //ディレクトリの有無を確認 無ければ作成 if(!is_dir($newDir)){ umask(0); $rc = mkdir($newDir, 0777); } /*ディレクトリここまで*/ /** **** 以下指定したURLからスクレイピング実行 どうやら商品詳細ページへのURLの中に商品IDがある模様。 声優、俳優の出演アニメリストをスクレイピングし、 さらにスクレイピングしたアニメの詳細ページのURLもスクレイピングする 2重スクレイピング構造。 **** **/ $html = file_get_html($act_url); //商品のURLを取得 $href = $html->find('#main-ds table table table a'); foreach($href as $element){ //取得したURLを、フルパス形式のURLにしないとスクレイピングできない //商品ページのURL $url = 'http://www.dmm.com'.$element->href; //取得したURLを=イコールで分割する $url_explode = explode("=", $url); //分割した文字列$url_explode[2]の中に、商品ID $id = str_replace ('/', '', $url_explode[2]); //タグを取り除いて、Wordpressの記事タイトルにする $title = strip_tags($element); //文字コード変換 $title = mb_convert_encoding($title, "UTF-8", "EUC-JP"); /** **** 以下商品ページのスクレイピング **** **/ $detail = file_get_html($url); //パッケージ画像取得 $image = $detail->find('table.mg-b12 #sample-video img',0); //取得したファイルのパッケージ画像を取得 $data = file_get_contents($image->src); //取得したファイルのパッケージ画像を自分のサーバーへ保存 file_put_contents('./dmm/'.$act_id .'/'.$id.'.jpg',$data); //記事にパッケージ画像を表示するためのHTMLタグ $img = '<img src="/dmm/'.$act_id .'/'.$id.'.jpg'.'">'; //商品の説明テキスト $text = strip_tags($detail->find('table.mg-b12 .lh4',0)); //テキスとの文字コード $text = mb_convert_encoding($text, "UTF-8", "EUC-JP"); //取得した日時。Wordpressにも日時を保存するため $date = date('Y-m-d H:i:s'); /*スクレイピングここまで あとは自分のDBに保存する動作*/ //記事に商品ページをスクレイピング実行する $sql=<<< EOF INSERT INTO `wp_posts` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`, `val`) VALUES (1, '{$date}', '{$date}', '<div>{$img}</div><p>{$text}<p>', '{$title}', '', 'publish', 'open', 'open', '', 'test', '', '', '{$date}', '{$date}', '', 0, 0, 'post', '', 0, '{$id}') EOF; //$sqlの登録に成功したかどうかを監視。 $res =& $mdb2->query($sql); //以下カスタムフィールドや、カテゴリーのカウント登録処理。もしも$sqlの実行が失敗したら、以下も実行しない。 if (!PEAR::isError($res)) { //フェッチモード設定 $mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC); //SQL文発行 $sqlStr = "select * from wp_posts order by id desc limit 1"; $res = $mdb2->queryAll($sqlStr); $LastInsert = $res[0]['id'];//最終投稿のidを取得 $sql2=<<< EOF INSERT INTO `wp_term_relationships` (`object_id`, `term_taxonomy_id`) VALUES ('{$LastInsert}', $act_id) EOF; $mdb2->exec($sql2); $sql5=<<< EOF INSERT INTO `wp_postmeta` (`post_id`, `meta_key`, `meta_value`) VALUES ('{$LastInsert}', 'url', '{$url}') EOF; $mdb2->exec($sql5); //このURLの声優・俳優リストの登録データをカウントする $sql3 = "SELECT COUNT(*) FROM wp_term_relationships WHERE `term_taxonomy_id` = $act_id"; $count = $mdb2->queryOne($sql3);//一つのデータしか返ってこない場合はqueryOne。 $sql4=<<< EOF UPDATE `wp_term_taxonomy` SET `count` = $count WHERE `wp_term_taxonomy`.`term_taxonomy_id` = $act_id; EOF; $mdb2->exec($sql4); } }
仮に閲覧可能ディレクトリの直下であれば、このようなURLにアクセスすればOK。
post.phpにアクセスすれば記入したURLの商品リストを引き抜くことが出来ます。
http://anime.kaasan.biz/post.php