← 記事に戻る
# クローラーするサービスの基礎。

[クローラー](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9)するサービスの基礎のソースを載せときます。殆ど[サイボウズ・ラボ](https://labs.cybozu.co.jp/)の人が書いたコードです。
このサンプルソースをそのまま貼り付けても一階層のリンクしか取得できません。
再帰処理の部分をコメントアウトしているからです。ちなみにコメントアウトを外してもメモリオーバーでおそらく
大体のサーバでエラーが出力されます。どうしたら良いのかといえば、DBに1階層目のリンクデータ、2階層目のリンクデータという様に保存する機能を施す。次にajaxで階層を受け渡しながら、再帰処理を行う。
再帰処理が終わる要素はそれ以上、下階層がないことを判断する。そのためには保存したデータを検索することが重要になる。=(イコール)
新規にデータを登録しているうちは、再帰処理を終わらせないようにすることが大事になる。
これの機能を加えることで巡回する事が可能になる。ここで注意しないといけないのが、外部リンクを保存しないことです。外部リンクまで保存していると巡回は永遠に終わらないでしょう・・・。
トイウコトデ
ほぼ??コピペソースを貼っときます。

```
<?php
echo json_encode($obj);
exit;
function get_linkarray($link)
{
	$context = stream_context_create(array("http" => array("method" => "GET", "header" => "User-Agent: simplecrawler.library.php 0.0.1")));
	$resultR = array();
	$resultS = simplecrawler($context, $link, $link, parse_url($link));
	foreach ($resultS as $k => $v) {
		$resultR[] = $v;
	}
	return $resultR;
}
function simplecrawler($context, $link, $burl, $base, $linkArrayDat = array())
{
	$linkArrayPre = crawler_link(crawler_page($link, $burl, $base, $context), $link, parse_url($link));
	foreach ($linkArrayPre as $k => $v) {
		if (!isset($linkArrayDat[$v])) {
			$linkArrayDat[$v] = $v;
			//$linkArrayDat = array_merge($linkArrayDat, simplecrawler($context, $v, $burl, $base, $linkArrayDat));
		}
	}
	return $linkArrayDat;
}
function crawler_page($link, $burl, $base, $context)
{
	if (strpos($link, $burl) === 0) {
		$page = @file_get_contents($link, false, $context);
		return $page === FALSE ? null : $page;
	} else {
		return null;
	}
}
function crawler_link($page, $burl, $base)
{
	$linkArray = array();
	if ($page === null) {
		return $linkArray;
	}
	preg_match_all("/[\s\n\t]+href\s?=\s?”(.*?)”/i", $page, $href);
	for ($i = 0; $i < count($href[1]); $i++) {
		$link = $href[1][$i];
		if (preg_match("/^http(s)*\:\/\//", $link)) {
			$result = $link;
		} elseif (preg_match("/^\/.+$/", $link)) {
			$result = $base["scheme"] . "://" . $base["host"] . $link;
		} else {
			// echo $base["path"] . “\n”;
			$b = preg_split("/\//", dirname($base["path"]));
			$t = preg_split("/\//", $link);
			foreach ($t as $v) {
				$l = $v === "." ? true : ($v === ".." ? array_pop($b) : array_push($b, $v));
			}
			$result = $base["scheme"] . "://" . $base["host"] . join("/", $b);
		}
		$linkArray[$result] = $result;
	}
	return $linkArray;
}

```



 [ ![](https://zip358.com/wp-content/uploads/2024/09/image-35.png) AI(人工知能)を使ったスタートアップが急増中

 ](https://zip358.com/2026/01/30/ai%ef%bc%88%e4%ba%ba%e5%b7%a5%e7%9f%a5%e8%83%bd%ef%bc%89%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%82%b9%e3%82%bf%e3%83%bc%e3%83%88%e3%82%a2%e3%83%83%e3%83%97%e3%81%8c%e6%80%a5%e5%a2%97%e4%b8%ad.html) 

 [ ![](https://zip358.com/wp-content/uploads/2026/01/image-28.png) ネトフリでハウス・オブ・ダイナマイト

 ](https://zip358.com/2026/01/29/%e3%83%8d%e3%83%88%e3%83%95%e3%83%aa%e3%81%a7%e3%83%8f%e3%82%a6%e3%82%b9%e3%83%bb%e3%82%aa%e3%83%96%e3%83%bb%e3%83%80%e3%82%a4%e3%83%8a%e3%83%9e%e3%82%a4%e3%83%88.html) 

 [ ![](https://zip358.com/wp-content/uploads/2026/01/image-26.png) Googleログインに変更した話.

 ](https://zip358.com/2026/01/28/google%e3%83%ad%e3%82%b0%e3%82%a4%e3%83%b3%e3%81%ab%e5%a4%89%e6%9b%b4%e3%81%97%e3%81%9f%e8%a9%b1.html) 

 [ ![](https://zip358.com/wp-content/uploads/2026/01/image-25-300x300.png) 広告と収入と狭間.

 ](https://zip358.com/2026/01/27/%e5%ba%83%e5%91%8a%e3%81%a8%e5%8f%8e%e5%85%a5%e3%81%a8%e7%8b%ad%e9%96%93.html) 

 [ ![](https://zip358.com/wp-content/uploads/2026/01/image-24-scaled.png) 年齢とか技術とか見た目とかさ.

 ](https://zip358.com/2026/01/26/%e5%b9%b4%e9%bd%a2%e3%81%a8%e3%81%8b%e6%8a%80%e8%a1%93%e3%81%a8%e3%81%8b%e8%a6%8b%e3%81%9f%e7%9b%ae%e3%81%a8%e3%81%8b%e3%81%95.html)