vipnytt / sitemapparser
符合 Sitemaps.org 协议的 XML 站点地图解析类。
v1.3.0
2023-11-27 15:24 UTC
Requires
- php: ^5.6 || ^7.0 || ^8.0
- ext-mbstring: *
- ext-simplexml: *
- lib-libxml: *
- guzzlehttp/guzzle: ^6.0 || ^7.0
Requires (Dev)
- codeclimate/php-test-reporter: ^0
- phpunit/phpunit: ^5.0 || ^6.0 || ^7.0 || ^8.0
Suggests
- caseyamcl/guzzle_retry_middleware: Allow automatic retry when request for sitemap fails
- gmponos/guzzle_logger: Advanced logging
- hamburgscleanest/guzzle-advanced-throttle: Throttle requests
README
XML 站点地图解析器
一个易于使用的 PHP 库,用于解析符合 Sitemaps.org 协议 的 XML 站点地图。
Sitemaps.org 协议是领先的标准,并由 Google、Bing、Yahoo、Ask 等许多其他公司支持。
功能
- 基本解析
- 递归解析
- 字符串解析
- 自定义 User-Agent 字符串
- 代理支持
- URL 黑名单
- 请求节流(使用 https://github.com/hamburgscleanest/guzzle-advanced-throttle)
- 重试(使用 https://github.com/caseyamcl/guzzle_retry_middleware)
- 高级日志记录(使用 https://github.com/gmponos/guzzle_logger)
支持的格式
- XML
.xml
- 压缩 XML
.xml.gz
- robots.txt 规则表
robots.txt
- 行分隔文本 (默认禁用)
要求
- PHP 5.6 或 7.0+,或者 HHVM
- PHP 扩展
- 可选
安装
该库可以通过 Composer 安装。只需将以下内容添加到您的 composer.json
文件中
{ "require": { "vipnytt/sitemapparser": "^1.0" } }
然后运行 composer update
。
入门
基本示例
返回仅包含 URL 的列表。
use vipnytt\SitemapParser; use vipnytt\SitemapParser\Exceptions\SitemapParserException; try { $parser = new SitemapParser(); $parser->parse('https://php.ac.cn/sitemap.xml'); foreach ($parser->getURLs() as $url => $tags) { echo $url . '<br>'; } } catch (SitemapParserException $e) { echo $e->getMessage(); }
高级
返回所有可用的标签,包括 Sitemaps 和 URLs。
use vipnytt\SitemapParser; use vipnytt\SitemapParser\Exceptions\SitemapParserException; try { $parser = new SitemapParser('MyCustomUserAgent'); $parser->parse('https://php.ac.cn/sitemap.xml'); foreach ($parser->getSitemaps() as $url => $tags) { echo 'Sitemap<br>'; echo 'URL: ' . $url . '<br>'; echo 'LastMod: ' . $tags['lastmod'] . '<br>'; echo '<hr>'; } foreach ($parser->getURLs() as $url => $tags) { echo 'URL: ' . $url . '<br>'; echo 'LastMod: ' . $tags['lastmod'] . '<br>'; echo 'ChangeFreq: ' . $tags['changefreq'] . '<br>'; echo 'Priority: ' . $tags['priority'] . '<br>'; echo '<hr>'; } } catch (SitemapParserException $e) { echo $e->getMessage(); }
递归
在解析过程中解析任何检测到的站点地图,以获取完整的 URL 列表。
使用 url_black_list
跳过属于父站点地图的站点地图。仅限精确匹配。
use vipnytt\SitemapParser; use vipnytt\SitemapParser\Exceptions\SitemapParserException; try { $parser = new SitemapParser('MyCustomUserAgent'); $parser->parseRecursive('http://www.google.com/robots.txt'); echo '<h2>Sitemaps</h2>'; foreach ($parser->getSitemaps() as $url => $tags) { echo 'URL: ' . $url . '<br>'; echo 'LastMod: ' . $tags['lastmod'] . '<br>'; echo '<hr>'; } echo '<h2>URLs</h2>'; foreach ($parser->getURLs() as $url => $tags) { echo 'URL: ' . $url . '<br>'; echo 'LastMod: ' . $tags['lastmod'] . '<br>'; echo 'ChangeFreq: ' . $tags['changefreq'] . '<br>'; echo 'Priority: ' . $tags['priority'] . '<br>'; echo '<hr>'; } } catch (SitemapParserException $e) { echo $e->getMessage(); }
行分隔文本字符串的解析
注意:此功能默认禁用,以避免在期望 XML 时出现假阳性,但会获取纯文本。
要禁用 strict
标准,只需将此配置传递给构造函数参数 #2:['strict' => false]
。
use vipnytt\SitemapParser; use vipnytt\SitemapParser\Exceptions\SitemapParserException; try { $parser = new SitemapParser('MyCustomUserAgent', ['strict' => false]); $parser->parse('https://www.xml-sitemaps.com/urllist.txt'); foreach ($parser->getSitemaps() as $url => $tags) { echo $url . '<br>'; } foreach ($parser->getURLs() as $url => $tags) { echo $url . '<br>'; } } catch (SitemapParserException $e) { echo $e->getMessage(); }
节流
- 安装中间件
composer require hamburgscleanest/guzzle-advanced-throttle
- 定义主机规则
$rules = new RequestLimitRuleset([ 'https://www.google.com' => [ [ 'max_requests' => 20, 'request_interval' => 1 ], [ 'max_requests' => 100, 'request_interval' => 120 ] ] ]);
- 创建处理程序堆栈
$stack = new HandlerStack(); $stack->setHandler(new CurlHandler());
- 创建中间件
$throttle = new ThrottleMiddleware($rules); // Invoke the middleware $stack->push($throttle()); // OR: alternatively call the handle method directly $stack->push($throttle->handle());
- 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
- 将客户端作为参数传递或使用
setClient
方法
$parser = new SitemapParser(); $parser->setClient($client);
有关此中间件的更多详细信息,请参阅 此处
自动重试
- 安装中间件
composer require caseyamcl/guzzle_retry_middleware
- 创建堆栈
$stack = new HandlerStack(); $stack->setHandler(new CurlHandler());
- 将中间件添加到堆栈中
$stack->push(GuzzleRetryMiddleware::factory());
- 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
- 将客户端作为参数传递或使用 setClient 方法
$parser = new SitemapParser(); $parser->setClient($client);
有关此中间件的更多详细信息,请参阅 此处
高级日志记录
- 安装中间件
composer require gmponos/guzzle_logger
- 创建 PSR-3 风格的日志记录器
$logger = new Logger();
- 创建处理程序堆栈
$stack = new HandlerStack(); $stack->setHandler(new CurlHandler());
- 将日志记录器中间件推送到堆栈
$stack->push(new LogMiddleware($logger));
- 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
- 将客户端作为参数传递或使用
setClient
方法
$parser = new SitemapParser(); $parser->setClient($client);
有关此中间件配置的更多详细信息(例如日志级别、何时记录以及记录什么)请参阅 此处
附加示例
更多示例可在示例目录中找到。
配置
可用配置选项及其默认值
$config = [ 'strict' => true, // (bool) Disallow parsing of line-separated plain text 'guzzle' => [ // GuzzleHttp request options // http://docs.guzzlephp.org/en/latest/request-options.html ], // use this to ignore URL when parsing sitemaps that contain multiple other sitemaps. Exact match only. 'url_black_list' => [] ]; $parser = new SitemapParser('MyCustomUserAgent', $config);
如果还使用 GuzzleHttp 请求选项设置了 User-agent,则它具有最高优先级,并替换其他 User-agent。