PHP

とりあえずPHPでWebスクレイピングしてみたい人向けパッケージ

More than 3 years have passed since last update.

この記事はクローラー/Webスクレイピング Advent Calendar 2015の14日目です。

Guttieというライブラリを使って、更にラッパーパッケージPickUrlを作りました。

このライブラリは特定サイトのドメインを基準にしWebクロールを行っていきます。

※不具合等ありましたらpullリクエストお待ちしております。


PickUrl

https://packagist.org/packages/dimgraycat/pickurl


動作必要条件


  • PHP 5.5+


導入方法


composer.jsonのrequireに追加


composer.json

{

"require": {
"dimgraycat/pickurl": "*"
}
}


インストール

$ php composer.phar install


使い方


sample.php

<?php

require_once __DIR__ . '/vendor/autoload.php';

$spider = new PickUrl\Spider();
$spider->setUserAgent('MyCrawler/1.0.0');
$spider->setWaitTime(1); // 設定しない場合、デフォルトで10秒
$spider->addHook('before', function($crawler, $crawl_url) {
/*
* $crawler:goutteのインスタンス
* $crawl_url:これからクロールするURL
*/

print "$crawl_url\n";
});
$spider->addHook('after', function($crawler, $crawl_url, $searched_urls) {
/*
* $crawler:goutteのインスタンス
* $crawl_url:クロールしたURL
* $searched_urls:クロールしたサイトに存在したURL一覧
*/

print_r($searched_urls);
});

/*
* 指定したURLのドメイン配下をクロールする
* 今回はqiita.com配下をクロールします
* クロールが終われば終了する
* * 外部ドメインはクロールしません
*/

$spider->crawl('http://qiita.com/');


以下実行結果

http://qiita.com/

Array
(
[0] => http://qiita.com/about
[1] => https://qiita.com/sessions/forgot_password
[2] => https://qiita.com/auth/github
[3] => https://qiita.com/auth/twitter
[4] => http://qiita.com/terms
[5] => http://b.hatena.ne.jp/entry/http://qiita.com
[6] => https://twitter.com/share
[7] => http://kobito.qiita.com?utm_source=qiita&utm_medium=top
[8] => https://teams.qiita.com?utm_source=qiita&utm_medium=top
[9] => https://career.qiita.com?utm_source=qiita&utm_medium=top
[10] => http://increments.co.jp
[11] => https://qiita.com/terms
[12] => https://qiita.com/privacy
[13] => http://help.qiita.com
[14] => https://increments.zendesk.com/anonymous_requests/new
[15] => https://qiita.com/about
[16] => http://blog.qiita.com
[17] => https://qiita.com/api/v2/docs
[18] => https://teams.qiita.com/
[19] => http://kobito.qiita.com
[20] => http://career.qiita.com
[21] => http://qiita.com/
)
http://qiita.com/about
Array
(
[0] => http://ja.wikipedia.org/wiki/markdown
[1] => http://kobito.qiita.com/
[2] => http://qiita.com/organizations/beartail
[3] => http://qiita.com/organizations/eversense
[4] => http://qiita.com/organizations/beatrobo
[5] => http://qiita.com/organizations/cheekit
[6] => http://qiita.com/organizations/mixi
[7] => http://qiita.com/organizations/liginc
[8] => http://qiita.com/organizations/yumemi
[9] => http://qiita.com/organizations/m3dev
[10] => http://qiita.com/organizations/moneyforward
[11] => http://qiita.com/organizations/kddi
[12] => http://qiita.com/organizations/richlab
[13] => http://qiita.com/organizations/fablic
[14] => http://qiita.com/organizations
[15] => http://increments.co.jp
[16] => http://qiita.com/terms
[17] => http://qiita.com/privacy
[18] => http://help.qiita.com
[19] => https://increments.zendesk.com/anonymous_requests/new
[20] => http://qiita.com/about
[21] => http://blog.qiita.com
[22] => http://qiita.com/api/v2/docs
[23] => https://teams.qiita.com/
[24] => http://kobito.qiita.com
[25] => http://career.qiita.com
[26] => http://qiita.com/
)
... etc ...


addHook

addHookメソッドにはクロールする前(before)とクロールした後(after)を指定して、

クロージャーを記載します。

クロージャーの指定引数:

before : $crawler, $crawl_url
after : $crawler, $crawl_url, $searched_urls

beforeの場合は特定サイト配下にあるURLはcrawl_urlで取得できるので、

取得したURLをDBなどに入れる処理を書くことをおすすめします。

afterの場合はcrawl_urlにある全てのURLをsearched_urlsで取得できます。


その他


  • 引数のcrawlerに関しては、
    Goutteの記事が沢山ありますのでそちらをqiitaで検索してみると良いかもしれません

  • pullリクエストお待ちしております