疑問
PHPで簡単にスクレイピングする方法はある?
Googleが提供しているphpQueryを使うと、idやclassを指定してスクレイピング(中身を抽出)することができます。
利用するのは、下記のPHPファイルです。
参考
phpquery(外部リンク)
※phpQuery-0.9.5.386-onefile.zip(May 2, 2009)をダウンロードします。
以下からphpQueryの設定方法や使い方紹介します。
phpQueryの設定方法
まずは、ダウンロードしたphpQueryをサーバーにアップしてrequire_onceで読み込ませます。
※composerによるインストールは不要です。
require_once('phpQuery-onefile.php');
phpQueryの使い方
phpQueryの使い方も簡単です。
基本はページを丸ごと取得してDOM分析して利用するという形になっています。
基本的な使い方
//ページを丸ごと取得 $html = file_get_contents('https://xxxxx/'); //DOM分析 $doc = phpQuery::newDocument($html); //タグ、id、classを指定してデータを取得 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")
※attr()は取得したいattributeを指定できます。
text()は、テキストデータのみを取得します。
html()を使えば、HTMLタグごとスクレイピングできます。
テーブルデータをループして取得する
下記のようなテーブルデータがあった場合、foreachを使ってループ処理ができます。
<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>pintarest</td> <td>内容:あいうえお</td> <td>15:00</td> <td>https://xxx</td> </tr> </tbody> </table>
$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(); }
繰り返しが必要な場合はforeachを使うと便利です。