PHPでWebスクレイピングし、タウンワークから求人情報を取得

このエントリーをはてなブックマークに追加

PHPでWebスクレイピングしたい時はphpQuery。こちらからダウンロードできます。
phpquery

タウンワークをWebスプレイピングして情報を取得するサンプルを作成しました。

バイトル版はこちら PHPでWebスクレイピングし、バイトルから求人情報を取得

ファイル構成

L phpQuery-onefile.php
L sample.php

sample.php

下記の例では

$sleep = 10; //取得間隔

としていますので、10秒に1回のペースで取得します。

加えて、

$limit = 3; //取得する求人数

としていますので、10秒×3求人で、取得(表示)に合計30秒かかります。

<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title>タウンワーク取得</title>
	</head>

	<body>
		<h1>タウンワーク</h1>
		<?php
			
			// 例 $base_url = "https://townwork.net/tokyo/jc_001/";
			$base_url = "検索結果のURL";
			
			$domain = "https://townwork.net";
			$nightwork = "show"; 
		
			require_once("./phpQuery-onefile.php");
			
			// setup(タウンワークは1ページ30件)
			$startPage = 1; //開始するページ
			$maxPage = 1; //取得するページ数
			$limit = 3; //取得する求人数
			
			$sleep = 10; //取得間隔
			$posts = [];
			
			// setup 指定する親要素
			$box = "div.job-lst-main-cassette-wrap";
			// setup 指定する子ページ内の親要素
			$child_box ="div.container";
		
			$i=1;
			
			foreach (range($startPage, $maxPage) as $page) {
					
				// setup 
				if($page==1){
			    	$sc_url = $base_url;
				} else {
					$sc_url = "{$base_url}&page={$page}";
				}
				
			    $dom = \phpQuery::newDocumentFile($sc_url);
			
			    foreach ($dom[$box] as $row) {
			
					sleep($sleep);
											
					// setup 
					$child_url = pq($row)->find('.job-lst-box-wrap a.job-lst-main-box-inner')->attr('href');
					if(strpos($child_url,$domain) === false){
						$child_url = $domain.$child_url;
					}
		
					$child_companyname = pq($row)->find('.job-lst-main-contents .job-lst-txt-wrap h3.job-lst-main-ttl-txt')->text();
					$child_job = pq($row)->find('.job-lst-main-contents .job-lst-txt-wrap  p.job-lst-main-txt-lnk')->text();
					$child_salary = pq($row)->find('table.job-lst-main-box-tbl tr.job-main-tbl-inner:eq(0) td')->text();
					$child_place = pq($row)->find('table.job-lst-main-box-tbl tr.job-main-tbl-inner:eq(1) td')->text();
					$child_time = pq($row)->find('table.job-lst-main-box-tbl tr.job-main-tbl-inner:eq(2) td')->text();
		
					if($child_url!="") {
						$child_dom = phpQuery::newDocument(file_get_contents($child_url));				
						foreach ($child_dom[$child_box] as $child_row) {
							// setup group start
							$child_title = pq($child_row)->find('.contents-main-wrap .job-detail-box-wrap .job-detail-box-inner div.job-detail-txt-wrap')->text();
							$child_website = pq($child_row)->find('.contents-main-wrap .job-detail-box-wrap .job-detail-box-data .job-detail-box-tbl dl.job-ditail-tbl-inner a.jsc-thumb-link')->attr('href');
							$child_tel = pq($child_row)->find('.contents-main-wrap .job-detail-box-wrap .job-detail-box-data .job-detail-box-tbl .job-ditail-tbl-inner .detail-tel-box .detail-tel-ttl')->text();
							$child_tel .= pq($child_row)->find('.contents-main-wrap .job-detail-box-wrap .job-detail-box-data .job-detail-box-tbl .job-ditail-tbl-inner .detail-tel-box .detail-tel-num')->text();
											
							$child_area = pq($child_row)->find('.contents-hd-wrap ul.breadcrumbs-lst li::eq(1)')->text();
							$child_area .= pq($child_row)->find('.contents-hd-wrap ul.breadcrumbs-lst li::eq(2)')->text();
							$child_area .= pq($child_row)->find('.contents-hd-wrap ul.breadcrumbs-lst li::eq(3)')->text();
							
							// trim
							$child_job = trim($child_job);
							$child_title = trim($child_title);
							$child_salary = trim($child_salary);
							$child_place = trim($child_place);
							$child_time = trim($child_time);
							$child_tel = trim($child_tel);
							$child_area = trim($child_area);
							$child_companyname = trim($child_companyname);		
	
							echo "<div>".$i."</div>";
							echo "<div>タイトル:<br>".$child_title."</div>";
							echo "<div>URL:<br>".$child_url."</div>";	
							echo "<div>職種:<br>".$child_job."</div>";
							echo "<div>給与:<br>".$child_salary."</div>";
							echo "<div>時間:<br>".$child_time."</div>";
							echo "<div>募集元:<br>".$child_companyname."</div>";
							echo "<div>エリア:<br>".$child_area."</div>";
							echo "<div>場所:<br>".$child_place."</div>";
							echo "<div>電話番号:<br>".$child_tel."</div>";
							echo "<div>Webサイト:<br>".$child_website."</div>";	
							echo "<hr>";
								
							$i++;
							if($limit){
								if($i>$limit){ break 3; }
							}
						}
					}
			    }
			}		
		?>	
		
	</body>

</html>

頻繁にWebスクレイピングを利用する場合は、検索結果のURLや最大取得数を設定するフォームを準備し、取得した情報をMySQLに登録していくと便利です。また、PHPファイルはバックグラウンドで実行させた方が良いです。

バックグラウンドで実行させる例

$cmd = 'nohup php sample.php '. $maxPage .' '. $limit .' > /dev/null & echo $!';
exec($cmd,$output_arr);

便利なWebスクレイピングですが、ご利用は自己責任でお願いします!