目的
就活する際にインターンや説明会に行く際に交通費が出ないと正直お金がいくらあっても足りないと周りから声があがり、「交通費ありで検索すればいいのでは」と言いつつ自分で見てみると
- 探しにくい
- そもそもタグがついていない
- 詳細までいかないと金額がわからない、対象なのかもわからない
- 就活サイトによっては交通費あり検索ができない
ということでスクレイピングしてきれいにまとめてみよう
実行環境
- windowsにPHPつっこんだ
- PHPQuery使用
スクレイピング
とりあえず
phpQuery-onefile.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を収集してます
あとは、複数ページがあるのでページ数を取得してループ
ここから「交通費あり」を洗い出します
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円と書く人もいませんし、円がなければ大体,
が金額に入っているはずなのでこの条件にしました。
$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円)"
},
※少し編集していますが、こんな感じにでます。
感想
スクレイピングで要素にアクセスするのはページによって変わりますし、スクレイピングは基本さえ覚えれば人によって様々なアプローチがあるので楽しいですね。
目的は若干しか達成できてない気もするので今後は交通費支給まとめサイトが産まれるのを祈りましょう。