LoginSignup
10
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-04

目的

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

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

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

実行環境

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

スクレイピング

とりあえず
phpQuery-onefile.phpとindex.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を収集してます
あとは、複数ページがあるのでページ数を取得してループ
ここから「交通費あり」を洗い出します

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円と書く人もいませんし、円がなければ大体,が金額に入っているはずなのでこの条件にしました。

index.php
$companyList = json_encode($companyList, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
file_put_contents("test.json" , $companyList);

最後に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円)"
    },

※少し編集していますが、こんな感じにでます。

感想

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

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

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6