PHP CURLで取得した情報をPDOを使ってテーブルに保存

PHP CURLで取得した情報をPDOを使ってMySQLのテーブルに保存する方法の概要をまとめました。

PHP CURLでWebページにアクセスして情報を取得する部分の詳細については下記記事参照。
PHP CURLで検索条件を入力するWebページの情報を取得
 
ここでは、商品一覧情報や賃貸物件情報など1Webページ内に複数の商品情報があり、その商品情報を各商品の名前、価格などの仕様を商品単位に保存する場合を例にしています。
 

1)PDOでデータベースへの接続

$dsn = 'mysql:host=localhost;dbname='.$database.';charset=utf8';

try {
  $dbh = new PDO($dsn, $username, $password,
    array(
      PDO::ATTR_EMULATE_PREPARES =>false,
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`",
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
  );
} catch (PDOException $e) {
  exit('データベース接続失敗。'.$e->getMessage());
}

2)PDOのprepareメソッドで実行するSQLを準備


 
$st = $dbh->prepare(“INSERT INTO PDO (id,name,price,count,・・) VALUES (:id,:name,:price,:count,・・)”);
 

3)PHP CURLでWebページ取得

$target = "http://www.example.com";
$agent = "Mozilla/4.0 ・・・・・";
$ref = "http://www.example.com/ref.htm";

$sc = curl_init();

curl_setopt($sc, CURLOPT_URL, $target);
curl_setopt($sc, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($sc, CURLOPT_USERAGENT, $agent); 
curl_setopt($sc, CURLOPT_REFERER, $ref);

$web_page = curl_exec($sc); 

curl_close($sc);

4)商品一覧情報から1商品あたりの情報を抽出


 
1Webページ内に複数の商品情報があるので、商品単位に情報を抽出し、$ary_matchという配列に保持します。
 
$pattern = ‘/\”Level1\”(.*)class=\”Level2_3\”/siU’;
preg_match_all($pattern, $web_page , $ary_match);
 
※$web_page:PHP CURLで取得したWebページ全体の情報
 

5)商品名、価格など個別情報を$result_array配列に保持

$i = 0;
$result_array = array();
foreach ($ary_match[1] as $match) {
  if ( preg_match("/名前.*value1\">(.*)<\/td>/siuU", $match, $item_array) ) {
    $result_array[$i]['name'] = $item_array[1];
  }
  if ( preg_match("/価格.*value2\">(.*)<\/td>/siuU", $match, $item_array) ) {
    $result_array[$i]['price'] = $item_array[1];
  }
   :
   :
  $i++;
}

6)1商品毎にテーブルに登録


 
1商品毎に情報を読み出し、PDOでSQLを実行しテーブルに保存します。上記2)PDOのprepareメソッドで指定したパラメータに取得した値をバインドしてSQLを実行します。

foreach ($result_array as $index) {
  foreach ($index as $key => $val) {
    switch ($key){
      case 'id':
        $st->bindValue(':id', $val , PDO::PARAM_STR);
        break;
      case 'name':
        $st->bindValue(':name', $val , PDO::PARAM_STR);
        break;
      case 'price':
        $st->bindValue(':build', $val , PDO::PARAM_INT);
        break;
    :
    }
  }
  $st->execute();
}
関連記事の目次

コメントを残す

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