phpでスクレイピングするメモ ― https://kihara.coresv.com/2018/11/01/79/I log.

phpでスクレイピングするメモ

概要

phpでスクレイピングしたかったけどできなかったので次回につなげたい。

phpQuery

phpQueryは、phpでjQueryのようにスクレイピングしてくれる便利なものです。

phpQueryなら3行でできちゃいます!っていう記事を見かけたけど、めんどいだけで普通に3行でできるっちゃできる。

ただ、file_get_contentsで内容をとってきて、正規表現で検索して、配列から取り出すというわりかし複雑な手順が必要です。正規表現と一回配列を見て拾う箇所を見つけるのが普通にめんどい。

あと、正規表現で検索するとテキストだけとろうと思ったら、中のタグもとっちゃうとか。そこで、jQueryっぽく.html().text()が使えるphpQueryはとっても楽っていう話です。

ちなみに同じ内容を表示させるコード。

//phpQueryを使った場合
require_once('phpQuery.php');
$html = file_get_contents('http://example.com/');
echo phpQuery::newDocument($html)->find("h1")->text();

//phpQueryなし
$file_body = file_get_contents('http://example.com/', NULL, NULL, 0, 10000);
preg_match_all("/<h1>(.*?)<\/h1>/i", $file_body, $matches);
echo $matches[1][0];

phpQueryだと、jQueryのような慣れ親しんだ書き方っぽくスクレイピングしてくれます。

使えなかった

使いたかったところでは、phpで作ったサイトを納品する案件で、一部クライアントが変更できるようにhtmlを読み込むという挙動でphpQueryを使おうと思っていました。

html編集の説明をだらだらコメントアウトに書いていたので、コメントアウトが見えないようにスクレイピングしたかったのです。

テスト環境では使えましたが、本番環境では使えませんでした。

サーバーのセキュリティが強めだと、サーバー内のfile_get_contentsやincludeを禁止していることがあるみたいです。

そんな理由思いつかなかった…。バックエンドも勉強せねば…。

しかし、今思い返してみれば、file_get_contentsしなくてもphpQuery使えたのでは、と思うのです。結局別の方法で表示できることだったので、試す時間も心の余裕もなかったけど…。

そんなわけで、同じような要件の案件になったときにも使えるようにphpQueryの関数をまとめようと思います。

phpQueryの呼び出し

これは、requireを使うか、require_onceを使うかの違いだけです。これでphpQueryを呼び出します。

require_once('phpQuery.php');

スクレイピング対象の呼び出し

よく紹介されているのは、phpQuery::newDocument()なのですが、意外といろいろあった。

phpQuery::newDocument($html, $contentType = null)
phpQuery::newDocumentFile($file, $contentType = null)
phpQuery::newDocumentHTML($html, $charset = 'utf-8')
phpQuery::newDocumentXHTML($html, $charset = 'utf-8')
phpQuery::newDocumentXML($html, $charset = 'utf-8')
phpQuery::newDocumentPHP($html, $contentType = null)
phpQuery::newDocumentFileHTML($file, $charset = 'utf-8')
phpQuery::newDocumentFileXHTML($file, $charset = 'utf-8')
phpQuery::newDocumentFileXML($file, $charset = 'utf-8')
phpQuery::newDocumentFilePHP($file, $contentType)

今回はhtmlファイルが内部にあったので、phpQuery::newDocumentFileHTML()を使えばよかったのでは、と後から思った次第。この関数を使う際にfile_get_contentsを通してたらだめなのですが、納品の時点ではphpQueryにこだわる必要はなかったため、試しませんでした。

呼び出し後のごにょごにょ

.find()が使えます。また、.addClass().attr()など、本当にjQueryのように見つけたり整形したりできます。


categories

実装メモ

tags

Update log

公開:2018/11/1@20:24