PHPで就活サイトをスクレイピングしてみた

# 目的
就活する際にインターンや説明会に行く際に交通費が出ないと正直お金がいくらあっても足りないと周りから声があがり、「交通費ありで検索すればいいのでは」と言いつつ自分で見てみると

- 探しにくい
- そもそもタグがついていない
- 詳細までいかないと金額がわからない、対象なのかもわからない
- 就活サイトによっては交通費あり検索ができない

ということでスクレイピングしてきれいにまとめてみよう

# 実行環境

- windowsにPHPつっこんだ
- PHPQuery使用

# スクレイピング
とりあえず
phpQuery-onefile.phpとindex.phpを同じ階層におきます

```php:index.php
require_once("phpQuery-onefile.php");

$companyList = [];
$url = "http://job.rikunabi.com/2019/search/pre/internship/result/?mainsub=0&pn=1";
$html = file_get_contents($url);
$pageNum = phpQuery::newDocument($html)->find(".js-p-search-resultCounter-count")->text();

for ($num = 1; $num < 3; $num++) {
  $url = "http://job.rikunabi.com/2019/search/pre/internship/result/?mainsub=0&pn=".$num;
  $html = file_get_contents($url);
  $array = phpQuery::newDocument($html)->find(".ts-p-_cassette-title");
  $urlArray = [];
  foreach ($array as $buf) {
      array_push($urlArray, "http://job.rikunabi.com".pq($buf)->find("a")->attr("href"));
  }
```

`file_get_contents`で指定したURLのページを取得
そこからは `find` やら `text` やらで欲しい情報をひっぱってくる
今回の場合はまず詳細ページのURLを収集してます
あとは、複数ページがあるのでページ数を取得してループ
ここから「交通費あり」を洗い出します

```php:index.php
 foreach ($urlArray as $url) {
    $companyArray = [];
    $page = file_get_contents($url);
    $pageArray = phpQuery::newDocument($page);
    $companyName = pq($pageArray)->find(".ts-p-company-mainTitle")->find("a")->text();
    $date = pq($pageArray)->find(".ts-p-_internshipList-item-info-row-detail-text_place")->text();
    $trArray = pq($pageArray)->find("tr");

    foreach ($trArray as $tr) {
      $td = pq($tr)->find(".ts-p-mod-dataTable02-cell_thLowHeight")->text();

      if (preg_match("/交通費/", $td) || preg_match("/報酬/", $td)) {

        $text = pq($tr)->find(".ts-p-mod-dataTable02-cell_tdRightPd")->text();

        if (preg_match("/,/", $text) || preg_match("/円/", $text)) {
            $companyArray["name"] = str_replace(array("\r", "\n"), '', $companyName);
            $companyArray["date"] = str_replace(array("\r", "\n"), '', $date);
            $companyArray["text"] = str_replace(array("\r", "\n"), '', $text);
            $companyList[++$id] = $companyArray;
        }
      }
    }
  }
}
```
さっき作った詳細ページのURLの配列をループさせてスクレイピング
このif文の条件が大分悩みました。
とりあえず「報酬」と「交通費」を含んでいる `td` をとり、そのテキストから
 `,` と `円` を含んでいればいいかなと。
ほかにも`支給`だったり`全額`もありかなーと思いましたが、
`支給なし`とか`全額自己負担`とかに邪魔されたので断念。
報酬欄に0円と書く人もいませんし、円がなければ大体`,`が金額に入っているはずなのでこの条件にしました。

```php:index.php
$companyList = json_encode($companyList, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
file_put_contents("test.json" , $companyList);
```
最後にjsonで出力しました。

# 結果

```json
"1": {
        "name": "株式会社------",
        "date": "7/30、8/6、8/13、8/20、8/27、9/3、9/10、9/25(東京)7/19、8/2、8/16、8/31、9/20(東京)7/12、7/23、8/9、8/23、9/6、9/18(東京)10月随時(東京)",
        "text": "☆全コース『報酬・交通費』をお支払い＜ビジネスコース＞ 2DAYインターンシップ　⇒　4,000円1DAYインターンシップ　⇒　1,000円＜マーケティング＆エンジニアリングコース＞1DAYインターンシップ　⇒　2,000円1DAYインターンシップ　⇒　10,000円"
    },
    "2": {
        "name": "----株式会社",
        "date": "7月随時、8月随時、9月随時、10月随時、11月随時、12月随時、1月随時(東京)7月随時、8月随時、9月随時、10月随時、11月随時、12月随時、1月随時(大阪)7月随時、8月随時、9月随時、10月随時、11月随時、12月随時、1月随時(愛知)",
        "text": "一律1500円の支給となります。"
    },
    "3": {
        "name": "株式会社----",
        "date": "8/7、8/9、8/21(東京)、8/7(大阪)、8/7(福岡)",
        "text": "■交通費支給（一律1,000円）"
    },
```
※少し編集していますが、こんな感じにでます。

# 感想
スクレイピングで要素にアクセスするのはページによって変わりますし、スクレイピングは基本さえ覚えれば人によって様々なアプローチがあるので楽しいですね。

目的は若干しか達成できてない気もするので今後は交通費支給まとめサイトが産まれるのを祈りましょう。