PHP CURLでWebページ内の特定の情報を抽出する一般的な方法をまとめました。
Webページ内に1つだけある情報を抽出するのは簡単なので、ここでは商品情報や賃貸物件情報など複数の情報がある場合を例にします。
PHP CURLでWebページ全体を取得する方法は下記参照。
1)抽出するWebページのソースを確認、抽出箇所をチェック
一つの商品の単位がどのようなHTMLで記述されているか確認し、どのような正規表現で商品単位に抽出できるか検討します。
例)賃貸物件の例
下記例では、<div class=”Level1″から次の<div class=”Level1″の手前までの</div>までが一つの商品情報の単位となっています。
ただしこの例では、各商品内のすべの情報が必要なわけではないので、<div class=”Level2_3″>の部分までを取得対象とします。
<!-- 一つ目の物件 -->
<div class="Level1" id="1111111">
<div class="Level2_1">
取得不要な情報
<div class="Level2_2">
賃料など取得必要な情報
<div class="Level2_3">
取得不要な情報
</div>
</div>
<!-- 二つ目の物件 -->
<div class="Level1" id="1111112">
<div class="Level2_1">
取得不要な情報
<div class="Level2_2">
賃料など取得必要な情報
<div class="Level2_3">
取得不要な情報
</div>
</div>
2)各商品単位に抽出し、配列に保持
preg_match_all関数で正規表現のパターンを使って各商品単位に抽出し、配列に保持します。
例)
上記1)で取得対象のHTMLパターンを確認し、下記部分を一つの単位として抽出することにしました。
<div class=”Level1″から
<div class=”Level2_3″>の手前まで
これを正規表現にしてpreg_match_all関数で記述すると下記になります。
$pattern = ‘/\”Level1\”(.*)class=\”Level2_3\”/siU’;
preg_match_all($pattern, $web_page , $ary_match);
※$web_page:PHP CURLで取得したWebページ全体の情報
※パターン全体にマッチした内容は、$ary_match[0][i]に保持され、パターン内のカッコで指定したサブパターン部分は、$ary_match[1][i]にほじされます。この例で必要なのは後者で、以下こちらを使用します。
3)各商品内の必要な個別情報を抽出
上記2)で取得した各商品情報の配列$ary_match[1][i]を順に読み出し、商品内の各項目をパターンマッチで抽出します。
例)
(HTMLの構成)
<div class="Level2_2">
:
<th class="item1"><span>家賃</span></th>
<td class="value1">7.4万円</td>
<th class="item1"><span>敷金</span></th>
<td class="value1">1ヶ月</td>
:
(家賃情報を抽出して配列に記録する例)
$i = 0;
$result_array = array();
foreach ($ary_match[1] as $match) {
if ( preg_match("/家賃.*value1\">(.*)<\/td>/siuU", $match, $item_array) ) {
$result_array[$i]['家賃'] = $item_array[1];
}
$i++;
}
4)抽出した個別情報に不要な文字が含まれている場合
改行やタブ、スペース、不要なタグなどが含まれてしまっている場合は、str_replace関数で除去します。
$value = str_replace(“\n”,””,$value); //改行
$value = str_replace(“\t”,””,$value); //タブ
$value = str_replace(“<br>”,”、”,$value); //<br>を”、”に置換
●サンプルコード全体
<?php
$target = "http://localhost/php/pcurl1.html";
$sc = curl_init();
curl_setopt($sc, CURLOPT_URL, $target);
curl_setopt($sc, CURLOPT_RETURNTRANSFER, TRUE);
$web_page = curl_exec($sc);
curl_close($sc);
$pattern = '/\"Level1\"(.*)class=\"Level2_3\"/siU';
preg_match_all($pattern, $web_page , $ary_match);
$i = 0;
$result_array = array();
foreach ($ary_match[1] as $match) {
if ( preg_match("/家賃.*value1\">(.*)<\/td>/siuU", $match, $item_array) ) {
$result_array[$i]['家賃'] = $item_array[1];
}
$i++;
}
$i = 1;
foreach ($result_array as $index) {
foreach ($index as $key => $val) {
print "第" . $i . "の賃貸物件の" . $key . "は、" . $val . "です。";
}
print "<br/>";
$i++;
}
?>
関連記事の目次