首页 > 技术笔记 > PHP实现获取sitemap.xml转成html网页提供抓取
2026
01-20

PHP实现获取sitemap.xml转成html网页提供抓取

实现思路

  1. $_GET['url'] 中获取传入的 sitemap 地址参数

  2. 增加参数合法性校验(非空、URL 格式合规)

  3. 保留原有 HTTP 上下文和解析逻辑,适配动态传入的 URL


<?php /**  * 动态传入sitemap地址(GET参数),解析并以HTML展示链接  * 使用方式:xxx.php?url=https://tech.sina.cn/sitemap.d.xml  */ // 步骤1:从GET参数获取sitemap地址,并做合法性校验 $sitemapUrl = isset($_GET['url']) ? trim($_GET['url']) : ''; // 校验URL是否合法 if (empty($sitemapUrl)) {     die('     <!DOCTYPE html>     <html>     <head>         <meta charset="UTF-8">         <title>参数错误</title>         <style>body { font-family: Arial; padding: 20px; }</style>     </head>     <body>         <h1 style="color: red;">缺少必要参数</h1>         <p>请通过GET方式传入sitemap地址,示例:</p>         <code style="background: #f5f5f5; padding: 5px 10px; display: block; margin: 10px 0;">             '.$_SERVER['PHP_SELF'].'?url=https://tech.sina.cn/sitemap.d.xml         </code>     </body>     </html>     '); } // 简单校验URL格式(至少以http/https开头) if (!preg_match('/^https?:\/\/.+$/', $sitemapUrl)) {     die('     <!DOCTYPE html>     <html>     <head>         <meta charset="UTF-8">         <title>参数错误</title>         <style>body { font-family: Arial; padding: 20px; }</style>     </head>     <body>         <h1 style="color: red;">URL格式非法</h1>         <p>请传入合法的HTTP/HTTPS协议的sitemap地址,示例:</p>         <code style="background: #f5f5f5; padding: 5px 10px; display: block; margin: 10px 0;">             '.$_SERVER['PHP_SELF'].'?url=https://tech.sina.cn/sitemap.d.xml         </code>     </body>     </html>     '); } // 设置页面编码 header('Content-Type: text/html; charset=UTF-8'); // 步骤2:检查必要扩展 if (!extension_loaded('SimpleXML')) {     die('<h1 style="color: red;">错误:PHP未启用SimpleXML扩展,无法解析XML文件</h1>'); } // 步骤3:配置远程访问的HTTP上下文(解决部分网站访问限制) $context = stream_context_create([     'http' => [         'header' => [             'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',             'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8',             'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'         ],         'timeout' => 30 // 超时时间30秒     ] ]); // 步骤4:读取并解析sitemap.xml try {     // 禁用实体加载,防止XXE漏洞     libxml_disable_entity_loader(true);          // 读取XML文件(带HTTP上下文)     $xmlContent = file_get_contents($sitemapUrl, false, $context);     if ($xmlContent === false) {         throw new Exception('无法获取远程sitemap.xml文件,请检查URL是否正确或网络是否可达');     }          // 解析XML内容     $xml = simplexml_load_string($xmlContent);     if ($xml === false) {         throw new Exception('解析sitemap.xml失败,文件格式可能不符合标准Sitemap协议');     }     // 步骤5:提取链接数据     $links = [];     foreach ($xml->url as $url) {         // 提取核心信息         $link = [             'loc' => (string)$url->loc,          // 链接地址(必填)             'lastmod' => isset($url->lastmod) ? (string)$url->lastmod : '未设置', // 最后更新时间             'changefreq' => isset($url->changefreq) ? (string)$url->changefreq : '未设置', // 更新频率             'priority' => isset($url->priority) ? (string)$url->priority : '未设置' // 优先级         ];         $links[] = $link;     }     // 步骤6:生成HTML页面 ?> <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>Sitemap 链接列表</title>     <style>         * { margin: 0; padding: 0; box-sizing: border-box; }         body { font-family: Arial, "微软雅黑", sans-serif; padding: 20px; background: #f5f5f5; }         .container { max-width: 1400px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }         h1 { color: #333; margin-bottom: 20px; border-bottom: 2px solid #007cba; padding-bottom: 10px; }         .link-item { padding: 15px; border-bottom: 1px solid #eee; }         .link-item:last-child { border-bottom: none; }         .link-url { font-size: 16px; margin-bottom: 8px; word-break: break-all; }         .link-url a { color: #007cba; text-decoration: none; }         .link-url a:hover { text-decoration: underline; }         .link-meta { font-size: 14px; color: #666; display: flex; gap: 20px; flex-wrap: wrap; }         .stats { margin: 20px 0; padding: 10px; background: #f9f9f9; border-radius: 4px; }         .empty-tip { color: #999; font-size: 16px; text-align: center; padding: 50px 0; }     </style> </head> <body>     <div>         <h1>Sitemap 链接列表</h1>         <div>             <strong>数据源:</strong><?php echo htmlspecialchars($sitemapUrl); ?> |              <strong>总链接数:</strong><?php echo count($links); ?> |              <strong>生成时间:</strong><?php echo date('Y-m-d H:i:s'); ?>         </div>                  <?php if (empty($links)): ?>             <p>未从sitemap.xml中解析到任何链接</p>         <?php else: ?>             <?php foreach ($links as $item): ?>                 <div>                     <div>                         <a href="<?php echo htmlspecialchars($item['loc']); ?>" target="_blank">                             <?php echo htmlspecialchars($item['loc']); ?>                         </a>                     </div>                     <div>                         <span>最后更新:<?php echo htmlspecialchars($item['lastmod']); ?></span>                         <span>更新频率:<?php echo htmlspecialchars($item['changefreq']); ?></span>                         <span>优先级:<?php echo htmlspecialchars($item['priority']); ?></span>                     </div>                 </div>             <?php endforeach; ?>         <?php endif; ?>     </body> </html> <?php // 异常处理 } catch (Exception $e) {     die('     <!DOCTYPE html>     <html>     <head>         <meta charset="UTF-8">         <title>解析失败</title>         <style>body { font-family: Arial; padding: 20px; }</style>     </head>     <body>         <h1 style="color: red;">解析sitemap失败</h1>         <p>错误信息:'.htmlspecialchars($e->getMessage()).'</p>         <p>请检查:</p>         <ul>             <li>传入的URL是否为有效的sitemap.xml地址</li>             <li>服务器网络是否能访问该URL</li>             <li>php.ini中 allow_url_fopen = On 是否开启</li>             <li>服务器是否有防火墙/代理限制对外访问</li>         </ul>     </body>     </html>     '); } ?>


  1. 补充参数缺失 / 非法时的友好提示

  • GET 参数获取与校验(关键)
    • $_GET['url'] 获取传入的 sitemap 地址,并用 trim() 去除首尾空格

    • 增加非空校验:如果未传 url 参数,给出清晰的使用示例提示

    • 增加URL 格式校验:通过正则 /^https?:\/\/.+$/ 确保传入的是 HTTP/HTTPS 协议的合法 URL,防止恶意参数

  • 通用化样式调整
    • 将页面主色调改回通用的蓝色(#007cba),适配任意 sitemap 解析场景

    • 保留长链接换行、弹性布局等优化,保证不同 URL 的展示体验

  • 使用方式示例:保存代码为 sitemap_parser.php 后,访问方式如下:

# 解析新浪科技sitemap sitemap_parser.php?url=https://tech.sina.cn/sitemap.d.xml # 解析其他网站sitemap sitemap_parser.php?url=https://www.example.com/sitemap.xml

本文》有 0 条评论

留下一个回复