kaishiyoku/hera-rss-crawler

处理RSS/Atom源的现代库

6.0.1 2024-03-30 19:30 UTC

README

本项目旨在简化获取和解析RSS源的过程。使用Hera RSS,您可以发现、获取和解析RSS源。

安装

  1. 简单地运行 composer require kaishiyoku/hera-rss-crawler
  2. 使用 $heraRssCrawler = new HeraRssCrawler() 创建一个新的爬虫实例
  3. 发现一个源,例如 $feedUrls = $heraRssCrawler->discoverFeedUrls('https://news.laravel.net.cn/')
  4. 选择您想使用的源;如果发现了多个源,请选择一个
  5. 获取源:$feed = $heraRssCrawler->parseFeed($feedUrls->get(0))
  6. 获取文章:$feedItems = $feed->getFeedItems()

重大变更

版本 6.x

  • 移除了对PHP 8.0的支持

版本 5.x

  • 移除了对PHP 7.4的支持

版本 4.x

  • 移除了对Laravel 8的支持

版本 3.x

  • FeedItem方法的 jsonSerialize 已更名为 toJson,并且不再返回 null,而是在序列化的JSON无效时抛出 JsonException

可用的爬虫选项

setRetryCount(int $retryCount): void

确定在发生异常时进行解析或发现源的尝试次数,例如,如果源不可达。

setLogger(LoggerInterface $logger): void

设置自己的日志实例,例如简单的文件日志。

setUrlReplacementMap(array $urlReplacementMap): void

对于在访问网站时重定向到另一个子域的网站,例如Reddit,非常有用。

setFeedDiscoverers(Collection $feedDiscoverers): void

您可以使用自己的源发现器。

您甚至可以自己编写,只需确保实现 FeedDiscoverer 接口即可。

<?php

namespace Kaishiyoku\HeraRssCrawler\FeedDiscoverers;

use GuzzleHttp\Client;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Kaishiyoku\HeraRssCrawler\Models\ResponseContainer;

/**
 * Discover feed URL by parsing a direct RSS feed url.
 */
class FeedDiscovererByContentType implements FeedDiscoverer
{
    public function discover(Client $httpClient, ResponseContainer $responseContainer): Collection
    {
        $contentTypeMixedValue = Arr::get($responseContainer->getResponse()->getHeaders(), 'Content-Type');

        $contentType = is_array($contentTypeMixedValue) ? Arr::first($contentTypeMixedValue) : $contentTypeMixedValue;

        // the given url is no valid RSS feed
        if (!$contentType || !Str::startsWith($contentType, ['application/rss+xml', 'application/atom+xml'])) {
            return new Collection();
        }

        return new Collection([$responseContainer->getRequestUrl()]);
    }
}

默认源发现器如下

new Collection([
    new FeedDiscovererByContentType(),
    new FeedDiscovererByHtmlHeadElements(),
    new FeedDiscovererByHtmlAnchorElements(),
    new FeedDiscovererByFeedly(),
])

这里的顺序很重要,因为发现器将按顺序调用,直到至少找到一个源URL,然后停止。

这意味着一旦发现器找到一个源,剩余的发现器将不再被调用。

如果您想主要使用HTML锚元素来发现源,则应将 FeedDiscovererByHtmlAnchorElements 发现器作为集合中的第一个发现器。

可用的爬虫方法

parseFeed(string $url): ?Feed

简单地获取并解析给定源URL的源。如果找不到可消费的RSS源,则返回 null

discoverAndParseFeeds(string $url): Collection

从网站URL发现源,并返回一个包含所有解析源的对象集合。

discoverFeedUrls(string $url): Collection

从网站URL发现源,并返回一个包含所有找到的源URL的对象集合。爬虫尝试发现源的方法有多种。顺序如下

  1. 通过内容类型发现源URL
    如果给定的URL已经是有效的源,则返回此URL
  2. 通过HTML head元素发现源URL
    在HTML文档中查找所有源URL
  3. 通过HTML锚元素发现源URL
    获取HTML元素的锚元素,并返回包含 rss 的URL
  4. 通过Feedly发现源URL
    使用Feedly API获取源URL
discoverFavicon(string $url): ?string

获取源的网站favicon。如果没有找到,则返回 null

checkIfConsumableFeed(string $url): bool

检查给定的URL是否是可消费的RSS源。

贡献

发现了任何问题或有改进爬虫的想法?请随时提交问题或pull请求。

未来计划

  • 添加Laravel门面

作者

电子邮件:dev@andreas-wiedel.de
网站:https://andreas-wiedel.de