勉強したことのメモ

webプログラマが勉強したことのメモ。

PHP Simple HTML DOM Parserを使用したスクレイピング方法

   

PHPでスクレイピングする際、preg_match_all等を用いて必要なデータを取得していたが、ソースコードを後から見ると分かりづらい。もうちょっとスマートな方法は無いかと探してみたところ「PHP Simple HTML DOM Parser」というライブラリが導入しやすく使いやすかった。以下に使用方法をメモ。

 

ライブラリの用意

以下からダウンロードし適当なディレクトリにアップロードする。

http://sourceforge.net/projects/simplehtmldom/

 

リファレンス

公式サイトは以下。

https://simplehtmldom.sourceforge.io/docs/1.9/index.html

公式じゃないっぽいけど日本語で分かりやすいのは以下。

https://so-zou.jp/web-app/tech/programming/php/library/simplehtmldom/

 

ソースコード

基本的な使い方

require_once('./simple_html_dom.php');

//スクレイピング対象のURL
$url = 'https://taitan916.info/blog/';

//ページ取得
$page = file_get_html($url);

//titleタグの中身を取得
foreach( $page->find('title') as $elem ){
    var_dump($elem->plaintext);
}

//OGPタグのog:descriptionのcontentを取得
foreach( $page->find('meta[property="og:description"]') as $elem ){
    var_dump($elem->content);
}

//メモリのクリーンアップ
$page->clear();

findの中身はjqueryのセレクタのようにidだと「#id」で、classだと「.class」のように指定できる。

「file_get_contents(): SSL operation failed」エラーが発生する場合

以下のように引数を指定する。

$context = stream_context_create(
    array(
        'http' => array(
            'follow_location' => false
        ),
        'ssl' => array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    )
);
$page = file_get_html($url, 0, $context);

 

data要素を取得したい場合

例えば<span id="test" data-price="100" data-count="50">みたいな要素からdata-priceとdata-countの値を取得したい場合は以下のように取得する。

foreach( $page->find('#test') as $elem ){
    $elem_attr = $elem->attr;
    var_dump( $elem_attr['data-price'] );
    var_dump( $elem_attr['data-count'] );
}

 

所感

本ライブラリは非常に簡単で使いやすいもののページ取得時はcurlではなくfile_get_contentsを用いているため以前にメモしたhosts設定を行った上でのアクセスはできないっぽい。

こちらの方法でcurlで動くように書き換えればいけるかも。

 - PHP

  関連記事

短縮URL(リダイレクトページ)

<? /* 管理画面とあわせて使う。 short_url直下にこのphpを ...

PHP5.4系でAPCが上手く動かなかったので5.5にアップデート&Zend OPcache導入

PHP5.3系から5.4系にアップデートしてから、WordPressがちょっと重 ...

日付の比較で○日前というのを調べる

PHP及びjavascriptで日付の比較をしたく、締切日とかではなく ○日前と ...

エラー管理

<? /*エラー管理*/ //画面上にエラー表示させるかどうか。0⇒非表示 ...

ブログサービスの様にサブドメインを動的に生成する方法  

ブログサービスの様に「hoge」というログインIDを作成した際、「hoge.bl ...

no image
PHPでもキャッシュで画像が表示されない

ここみたいにキャッシュの影響と考えられるケースが発生した。 結果的にキャッシュっ ...

PHPのintval

intvalという見たこと無い関数があったのでメモ。 ■リファレンス http: ...

HTML / CSSで作成したコンテンツをPDFファイルで出力する方法(TCPDF)

HTML / CSSで作成したコンテンツをPDFファイルで出力させたい。以前mp ...

PHPでお問い合わせ等のform構築時にCSRF対策を行う方法

他社が制作されたお問い合わせフォームを改修する案件があった。ソースコードを拝見し ...

PHPで携帯(スマホ含)とPCの判別

PHPにて携帯(スマホ含む)とPCで処理を振り分けたかったのでメモ。 <? ...