1028.us

管理ページへ

ログアウト

phpQuery

参考
スクレイピング応用編
今更ながらPHPでスクレイピングをしてみる
phpquery

# composerのアップデート
$ composer self-update
# phpqueryパッケージのインストール
$ composer require electrolinux/phpquery
# 確認
$ composer info electrolinux/phpquery
# phpQueryを読み込む
require_once("vendor/autoload.php");
# Webサイトの取得
$html = file_get_contents("http://kojikamming.com/");
# 要素取得
echo phpQuery::newDocument($html)->find("h1")->text();

階層を指定して要素を取得する

例えば、下記の3番目の li を取得する場合、eq で指定する。

<div class="toc">
<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
</ul>
</div>
echo phpQuery::newDocument($html)->find(".toc")->find("ul")->find("li:eq(4)")->text();

オブジェクトとして扱う

# phpQueryを読み込む
require_once("vendor/autoload.php");
# Webサイトの取得
$html = file_get_contents("http://kojikamming.com/");
# オブジェクトとして扱う(配列として格納される)
$obj = phpQuery::newDocument($html);

# 全てのh2タグを取得
$titleArr = $obj['h2'];

// 配列なのでforeachで回せる
foreach($titleArr as $val) {
  // pq()メソッドでオブジェクトとして再設定しつつ、さらに下ってhrefを取得
  echo pq($val)->find('a')->attr('href').PHP_EOL;
}

要素の取得

echo $doc["title"]->text();
# pq()メソッドで取得
echo pq("title")->text();

pq関数は要素レベルを扱うjQueryの$()に相当する関数で、jQueryと同じやり方でスクレイピングが可能。

idで指定する

echo $doc["#greeting"]->text();

classで指定する

クラスの場合は複数の要素が存在するので、必要に応じて取得する要素を限定するようにする。

echo $doc[".btn:eq(1)"]->text();

静的に指定する

2行2列の2つのテーブルがあり、その2つ目のテーブルの1行目の2列目の要素(tokyo)を取得する場合は。

echo $doc["table:eq(1) tr:eq(0) td:eq(1)"]->text();
# find()を利用する場合
echo $doc["table:eq(1)"]->find("td:eq(1)")->text();

取得の種類

内容の取得

->text() を使用する。例えばテーブルのemailという項目を値を取得する場合は、contains+を利用して隣の要素を指定したりする。

echo $doc["table"]->find("td:contains('email') + td")->text();

HTMLの取得

$html = $doc["table:eq(1)"]->find("td:contains('image') + td")->html();

アトリビュートの取得

$src = $doc["table:eq(1)"]->find("td:contains('image') + td img")->attr("src");
$href = $doc["table:eq(1)"]->find("td:contains('detail') + td a")->attr("href");

List of Category