php原生開發(fā)生成網(wǎng)站地圖
以下是一個php實現(xiàn),可以通過指定URL獲取頁面鏈接??梢垣@取3層頁面鏈接,同時也屏蔽外部鏈接和去除重復(fù)鏈接。
<?php function getLinks($url, $depth){ static $seen = array(); // 用于存儲已經(jīng)訪問過的鏈接 if (isset($seen[$url]) || $depth === 0) { // 如果已經(jīng)訪問過該鏈接或達到最大深度則直接返回 return; } $seen[$url] = true; // 將當(dāng)前鏈接標記為已訪問 $html = file_get_contents($url); // 獲取html內(nèi)容 preg_match_all("/<a\s+(?:[^>]*?\s+)?href=(?:'([^']*)'|"([^"]*)")/si", $html, $matches); // 使用正則表達式匹配所有鏈接 $links = array(); // 用于存儲可用鏈接 foreach ($matches[1] as $link) { if (!empty($link) && strpos($link, '#') !== 0) { // 如果鏈接不為空且不是錨點鏈接 $absoluteLink = resolveLink($url, $link); // 獲取絕對路徑 if (strpos($absoluteLink, 'javascript:') === false && isSameDomain($url, $absoluteLink)) { // 如果不是javascript鏈接且與原始鏈接同域名 $links[] = $absoluteLink; // 存儲鏈接 } } } foreach ($links as $link) { // 遍歷所有可用鏈接 getLinks($link, $depth - 1); // 遞歸獲取下一層鏈接 } return array_unique($seen); } function resolveLink($base_url, $link){ if (parse_url($link, PHP_URL_SCHEME)) { return $link; // 如果鏈接包含協(xié)議,則為絕對路徑,直接返回 } $base_url_parts = parse_url($base_url); // 獲取原始鏈接的各個部分 $path = '/' . ltrim($link, '/'); // 以'/'開頭的路徑為相對路徑 $base_path = $base_url_parts['path']; $base_path = preg_replace('#/[^/]*$#', '', $base_path); // 獲取原始鏈接的上層路徑 $resolved_url = $base_url_parts['scheme'] . '://'; $resolved_url .= $base_url_parts['host']; $resolved_url .= $base_path . $path; return rtrim($resolved_url, '/'); } function isSameDomain($url1, $url2){ $url1_parts = parse_url($url1); $url2_parts = parse_url($url2); return isset($url1_parts['host']) && isset($url2_parts['host']) && $url1_parts['host'] === $url2_parts['host']; } $url = 'http://example.com'; // 需要獲取鏈接的頁面URL $depth = 3; // 最大深度 $links = getLinks($url, $depth); print_r($links); ?>
上面的代碼使用file_get_contents()函數(shù)獲取HTML內(nèi)容,并使用正則表達式匹配頁面上的所有鏈接。匹配到的鏈接會被過濾,只保留同域名下的鏈接。過濾后的鏈接會遞歸地進行下一層的鏈接獲取,并按照$depth參數(shù)指定的深度進行限制。所有獲取到的鏈接會以數(shù)組形式返回。
如果需要屏蔽特定的鏈接,例如廣告鏈接或者某些特定的外鏈,可以在代碼中添加額外的判斷邏輯即可。
下面是一個獲取鏈接生成網(wǎng)站地圖的php實現(xiàn),可以將結(jié)果生成為txt、html、xml三種格式:
function generateSiteMap($url, $depth, $format) { $links = getLinks($url, $depth); switch($format) { case 'txt': saveAsTxt($links); break; case 'html': saveAsHtml($links); break; case 'xml': saveAsXml($links); break; default: echo 'Unsupported format'; } } function saveAsTxt($links) { $sitemap = ''; foreach($links as $link) { $sitemap .= $link . "\n"; } file_put_contents('sitemap.txt', $sitemap); } function saveAsHtml($links) { $sitemap = '<html><head><title>Sitemap</title></head><body><ul>'; foreach($links as $link) { $sitemap .= '<li><a href="' . $link . '">' . $link . '</a></li>'; } $sitemap .= '</ul></body></html>'; file_put_contents('sitemap.html', $sitemap); } function saveAsXml($links) { $sitemap = '<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; foreach($links as $link) { $sitemap .= '<url><loc>' . $link . '</loc></url>'; } $sitemap .= '</urlset>'; file_put_contents('sitemap.xml', $sitemap); }
該實現(xiàn)在原有獲取鏈接的基礎(chǔ)上添加了生成sitemap的功能,并根據(jù)format參數(shù)決定輸出的文件格式。
saveAsTxt()函數(shù)將所有鏈接以一行一個的方式存儲到txt文件中。
saveAsHtml()函數(shù)將所有鏈接以HTML的格式存儲到html文件中。
saveAsXml()函數(shù)將所有鏈接以XML的格式存儲到xml文件中。
例如,要將網(wǎng)站http://example.com的內(nèi)容生成一個最大深度為3的sitemap.xml文件,可以調(diào)用以下代碼:
generateSiteMap('http://example.com', 3, 'xml');
這將生成一個sitemap.xml文件,其中包含所有的鏈接。同時,可以根據(jù)需要生成txt和html格式的sitemap,只需將第三個參數(shù)改為'txt'或'html'即可。
[聲明]原創(chuàng)不易,請轉(zhuǎn)發(fā)者備注下文章來源(hbsjsd.cn)【速建時代】。