vipnytt/sitemapparser

符合 Sitemaps.org 协议的 XML 站点地图解析类。

v1.3.0 2023-11-27 15:24 UTC

This package is auto-updated.

Last update: 2024-08-27 17:10:38 UTC


README

Build Status Scrutinizer Code Quality Code Climate Test Coverage License Packagist Join the chat at https://gitter.im/VIPnytt/SitemapParser

XML 站点地图解析器

一个易于使用的 PHP 库,用于解析符合 Sitemaps.org 协议 的 XML 站点地图。

Sitemaps.org 协议是领先的标准,并由 Google、Bing、Yahoo、Ask 等许多其他公司支持。

SensioLabsInsight

功能

支持的格式

  • XML .xml
  • 压缩 XML .xml.gz
  • robots.txt 规则表 robots.txt
  • 行分隔文本 (默认禁用)

要求

安装

该库可以通过 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();
}

节流

  1. 安装中间件
composer require hamburgscleanest/guzzle-advanced-throttle
  1. 定义主机规则
$rules = new RequestLimitRuleset([
    'https://www.google.com' => [
        [
            'max_requests'     => 20,
            'request_interval' => 1
        ],
        [
            'max_requests'     => 100,
            'request_interval' => 120
        ]
    ]
]);
  1. 创建处理程序堆栈
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
  1. 创建中间件
$throttle = new ThrottleMiddleware($rules);

 // Invoke the middleware
$stack->push($throttle());
 
// OR: alternatively call the handle method directly
$stack->push($throttle->handle());
  1. 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
  1. 将客户端作为参数传递或使用 setClient 方法
$parser = new SitemapParser();
$parser->setClient($client);

有关此中间件的更多详细信息,请参阅 此处

自动重试

  1. 安装中间件
composer require caseyamcl/guzzle_retry_middleware
  1. 创建堆栈
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
  1. 将中间件添加到堆栈中
$stack->push(GuzzleRetryMiddleware::factory());
  1. 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
  1. 将客户端作为参数传递或使用 setClient 方法
$parser = new SitemapParser();
$parser->setClient($client);

有关此中间件的更多详细信息,请参阅 此处

高级日志记录

  1. 安装中间件
composer require gmponos/guzzle_logger
  1. 创建 PSR-3 风格的日志记录器
$logger = new Logger();
  1. 创建处理程序堆栈
$stack = new HandlerStack();
$stack->setHandler(new CurlHandler());
  1. 将日志记录器中间件推送到堆栈
$stack->push(new LogMiddleware($logger));
  1. 手动创建客户端
$client = new \GuzzleHttp\Client(['handler' => $stack]);
  1. 将客户端作为参数传递或使用 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。