疑問
PHPで簡単にスクレイピングする方法はある?
PHPを使って特定のURLをスクレイピングをするなら、Googleが提供しているphpQueryを使うと便利です。
指定したURLで使われている「id」や「class」を指定して、スクレイピング(中身を抽出)ができます。
Contents
PHPでスクレイピングをする方法
Googleが提供している、下記のPHPファイルを利用します。composerなしで使えます。
利用するPHPファイル
一番新しい「phpQuery-0.9.5.386-onefile.zip(May 2, 2009)」をダウンロードしてください。
phpQueryの設定方法
ダウンロードしたファイルを解凍すると「phpQuery-onefile.php」が作成されます。
このファイルを、FTPでサーバーにアップし、require_onceで読み込ませます。
require_once(dirname(__FILE__).'phpQuery-onefile.php');
このファイル一つでスクレイピングができます。
phpQueryの使い方
phpQueryの使い方を説明します。
phpQueryでは、ページを丸ごと取得してDOMを分析し、指定した値を取り出すという仕組みになっています。
基本的な使い方
//ページを丸ごと取得 $html = file_get_contents('https://xxxxx/'); //DOM分析 $doc = phpQuery::newDocument($html); //タイトルタグを指定してデータを取得 echo $doc['title']->text(); echo pq('title')->text();
要素の指定方法は、下記のどちらでも、抽出結果は同じです。
- $doc['title']
- pq('title')
上記の例で指定した「title」は、HTMLタグですが、id(#aiueo)やclass(.aiueo)も指定できます。
echo pq('div#aiueo')->text();
idやclassはつなげて指定することもできます(#sns .twitter)。
echo pq('div#sns .twitter')->text();
また、text()の部分は、下記のものに変更できます。
- text()
- html()
- attr("src")
- attr("href")
- attr("rel")
- attr("id")
- attr("class")
text()は、テキストデータのみを取得します。
html()を使えば、HTMLタグごとスクレイピングできます。
また、attr("xxx")と指定すると、指定したタグに設定されているattributeの値を抽出できます。
テーブルデータをループして抽出する
phpQueryを使って、テーブルタグの特定の値を、抽出することもできます。
テーブルタグを指定して、その中の値をループ処理でスクレイピングします。
例えば、下記のようなテーブルタグがあるとします。
<table> <tbody> <tr> <td>1</td> <td>twitter</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> <tr> <td>2</td> <td>facebook</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> <tr> <td>3</td> <td>facebook</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> <tr> <td>4</td> <td>twitter</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> <tr> <td>5</td> <td>pinterest</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> </tbody> </table>
このテーブルタグから、tdタグの値をスクレイピングしたい場合は、下記のようなサンプルコードになります。
$html = file_get_contents('https://xxxx'); $doc = phpQuery::newDocument($html); foreach($doc['tbody:eq(0) tr'] as $row){ $num = pq($row)->find('td:eq(0)')->text(); $sns = pq($row)->find('td:eq(1)')->text(); $body = pq($row)->find('td:eq(2)')->text(); $time = pq($row)->find('td:eq(3)')->text(); $url = pq($row)->find('td:eq(4)')->text(); }
以上が、phpQueryの使い方です。
Githubにあるphpqueryを使うこともできる
phpQueryファイルは、Githubにもあります。このphpQueryもcomposerなしで使えます。
利用するPHPファイル
「Code」>「Download ZIP」をクリックします。
TobiaszCudnik / phpqueryの設定方法
ダウンロードしたZIPファイルを解凍すると、phpquery-masterフォルダができます。
このフォルダの中にある「phpQuery」フォルダをだけを使います。他のファイルは使いません。
「phpQuery」フォルダをまるごと、FTPでサーバーにアップし、require_onceで読み込ませます。
require_once(dirname(__FILE__).'/phpQuery/phpQuery.php');
TobiaszCudnik / phpqueryの使い方は、前述のphpQueryの使い方と同じなので省きます。
どちらのphpQueryを使っても、同じようにスクレイピングができます。
phpQueryを使って、検索順位チェックツールも作れます。
-
検索順位チェックツールをPHPで自作する方法:サンプルコード付
検索順位チェックツールを、PHPで自作してみました。 順位チェックできるキーワードは、10個くらいなので、お試しレベルのツールです。エラー処理などは全くつけていません。 作り方やサンプルコードを紹介し ...