【Webアプリ】PHPでスクレイピング

f:id:utalab:20200824111238p:plain

ジモティーで、毎日3つ投稿しています。

ジモティーの投稿管理では、閲覧数があります。閲覧数で人気度がわかると思いますが、閲覧数の推移がわかりません。

そこで、データを毎日チェックしようと思いました。

ポイント

  • 今回はDBは使用せず、スクレイピングのみ
  • PHPのスクレイピングライブラリ

Webアプリのデモ

こちらから動作確認できます。

実際のデータを元に、3件のデータを用意しました。

こちらがデータとなります。

f:id:utalab:20200824111645p:plain

データのソースを表示します。クロームなら右クリックで表示できます。

f:id:utalab:20200824111822p:plain

すべてのソースをコピーし、ペーストします。

f:id:utalab:20200824112052p:plain

送信ボタンをクリックします。

f:id:utalab:20200824115932p:plain

残念!

エラーが表示されました。

自分のPCではエラーはでなかったのですが、ホスティングサービスの制限がいろいろあるようです。

最低限のデータに編集しました。

こちらのデータを使用します。

f:id:utalab:20200824121135p:plain

ソースをコピペし、送信ボタンをクリックします。

f:id:utalab:20200824121326p:plain

以下は、テーブルに表示するための配列を生成する部分のプログラムです。

<php 

// PHP Simple HTML DOM Parser の読み込み
include("lib/scraping/simple_html_dom.php");

// URLを指定してオブジェクト化します
$src = $_POST["src"];
$html = str_get_html($src);

$trs = $html->find("tr");
$datas = array();
foreach($trs as $tr){
    // 行の1行目は飛ばす
    if($tr->find("td",0)->plaintext != "投稿日"){
        $data = array();
        $data['key']    = $tr->find("td",1)->plaintext;
        $data['title']  = $tr->find("td",3)->plaintext;
        $data['cnt']    = $tr->find("td",9)->plaintext;
        array_push($datas, $data);
    }
}
?>

ポイント

今回はDBは使用せず、スクレイピングのみ

まずは、欲しいデータだけを抽出するために、抽出方法を決定しないといけません。

いろいろと話題のスクレイピング。

最近ではPythonがもてはやされていますが、PHPでもライブラリを探すとありました。

PHPのスクレイピングライブラリ

最初は、「phpQuery」というライブラリでやってみました。

なぜか、mb_eregi() がないってエラー。php.iniで、マルチバイトは有効になっているはずなのに。。。

いろいろネットで探してみると、こちらの記事を見つけました。

blog.s-giken.net

「phpQuery」は、2009年以降、更新されていないけど、「PHP Simple HTML DOM Parser」は現在でも更新され続けています。

幸いにも「phpQuery」でうまくいかなくてよかったです。

検索で上位や大量に表示されても、よく吟味する必要がありますね。

というわけで、うまくスクレイピングできました!

まとめ

これでPHPでも、いろいろスクレイピングができますね!

でも、ホスティングサービスでは負荷がかかったり、制限もあるようなので、自分のPC上でやることになりそうです。

さて、DBを使って毎日チェックできるようにしよう!