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

この記事は[クローラー／Webスクレイピング Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crawler)の14日目です。

Guttieというライブラリを使って、更にラッパーパッケージ[PickUrl](https://packagist.org/packages/dimgraycat/pickurl)を作りました。
このライブラリは特定サイトのドメインを基準にしWebクロールを行っていきます。
※不具合等ありましたらpullリクエストお待ちしております。

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

## 動作必要条件
- PHP 5.5+

## 導入方法

### composer.jsonのrequireに追加

```json:composer.json
{
    "require": {
        "dimgraycat/pickurl": "*"
    }
}
```

## インストール

```
$ php composer.phar install
```

## 使い方

```php: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リクエストお待ちしております