文章来源(hbsjsd.cn)湖北高端网站定制开发公司-速建时代
以下是一个php实现,可以通过指定URL获取页面链接。可以获取3层页面链接,同时也屏蔽外部链接和去除重复链接。
<?php function getLinks($url, $depth){ static $seen = array(); // 用于存储已经访问过的链接 if (isset($seen[$url]) || $depth === 0) { // 如果已经访问过该链接或达到最大深度则直接返回 return; } $seen[$url] = true; // 将当前链接标记为已访问 $html = file_get_contents($url); // 获取html内容 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; // 如果链接包含协议,则为绝对路径,直接返回 } $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()函数获取HTML内容,并使用正则表达式匹配页面上的所有链接。匹配到的链接会被过滤,只保留同域名下的链接。过滤后的链接会递归地进行下一层的链接获取,并按照$depth参数指定的深度进行限制。所有获取到的链接会以数组形式返回。
如果需要屏蔽特定的链接,例如广告链接或者某些特定的外链,可以在代码中添加额外的判断逻辑即可。
下面是一个获取链接生成网站地图的php实现,可以将结果生成为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); }
该实现在原有获取链接的基础上添加了生成sitemap的功能,并根据format参数决定输出的文件格式。
saveAsTxt()函数将所有链接以一行一个的方式存储到txt文件中。
saveAsHtml()函数将所有链接以HTML的格式存储到html文件中。
saveAsXml()函数将所有链接以XML的格式存储到xml文件中。
例如,要将网站http://example.com的内容生成一个最大深度为3的sitemap.xml文件,可以调用以下代码:
generateSiteMap('http://example.com', 3, 'xml');
这将生成一个sitemap.xml文件,其中包含所有的链接。同时,可以根据需要生成txt和html格式的sitemap,只需将第三个参数改为'txt'或'html'即可。
[声明]原创不易,请转发者备注下文章来源(hbsjsd.cn)【速建时代】。