この記事はクローラー/Webスクレイピング Advent Calendar 2015の14日目です。
Guttieというライブラリを使って、更にラッパーパッケージPickUrlを作りました。
このライブラリは特定サイトのドメインを基準にしWebクロールを行っていきます。
※不具合等ありましたらpullリクエストお待ちしております。
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リクエストお待ちしております