クローラーするサービスの基礎のソースを載せときます。殆どサイボウズ・ラボの人が書いたコードです。
このサンプルソースをそのまま貼り付けても一階層のリンクしか取得できません。
再帰処理の部分をコメントアウトしているからです。ちなみにコメントアウトを外してもメモリオーバーでおそらく
大体のサーバでエラーが出力されます。どうしたら良いのかといえば、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;
}