kaishiyoku / hera-rss-crawler
处理RSS/Atom源的现代库
6.0.1
2024-03-30 19:30 UTC
Requires
- php: ^8.1
- ext-dom: *
- ext-json: *
- ext-libxml: *
- ext-simplexml: *
- guzzlehttp/guzzle: ^7.5.0
- illuminate/support: ^9.0|^10.0|^11.0
- laminas/laminas-feed: ^2.20.0
- laminas/laminas-xml: ^1.5.0
- monolog/monolog: ^2.9.1|^3.3.1
- nesbot/carbon: ^2.66.0
- symfony/css-selector: ^5.4.21|^6.2.7
- symfony/dom-crawler: ^5.4.21|^6.2.7
Requires (Dev)
- laravel/pint: ^1.13
- mockery/mockery: ^1.5.1
- phpdocumentor/reflection-docblock: ^5.3.0
- phpstan/phpstan: ^1.10.6
- phpunit/phpunit: ^9.6.4|^10.0.15
- spatie/phpunit-snapshot-assertions: ^4.2.16
- symfony/var-dumper: ^5.4.21|^6.2.7
- symfony/yaml: ^5.4.21|^6.2.7
- dev-master
- 6.0.1
- 6.0.0
- 5.1.10
- 5.1.9
- 5.1.8
- 5.1.7
- 5.1.6
- 5.1.5
- 5.1.4
- 5.1.2
- 5.1.1
- 5.1.0
- 5.0.0
- 4.0.0
- 3.1.1
- 3.1.0
- 3.0.2
- 3.0.1
- 3.0.0
- 2.2.0
- 2.1.0
- 2.0.0
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.1
- 1.0.0
- 0.11.1
- 0.11.0
- 0.10.0
- 0.9.0
- 0.8.0
- 0.7.0
- 0.6.0
- 0.5.2
- 0.5.1
- 0.5.0
- 0.4.1
- 0.4.0
- 0.3.6
- 0.3.5
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.0
- 0.1.0
This package is auto-updated.
Last update: 2024-08-30 20:16:59 UTC
README
本项目旨在简化获取和解析RSS源的过程。使用Hera RSS,您可以发现、获取和解析RSS源。
安装
- 简单地运行
composer require kaishiyoku/hera-rss-crawler
- 使用
$heraRssCrawler = new HeraRssCrawler()
创建一个新的爬虫实例 - 发现一个源,例如
$feedUrls = $heraRssCrawler->discoverFeedUrls('https://news.laravel.net.cn/')
- 选择您想使用的源;如果发现了多个源,请选择一个
- 获取源:
$feed = $heraRssCrawler->parseFeed($feedUrls->get(0))
- 获取文章:
$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的对象集合。爬虫尝试发现源的方法有多种。顺序如下
- 通过内容类型发现源URL
如果给定的URL已经是有效的源,则返回此URL - 通过HTML head元素发现源URL
在HTML文档中查找所有源URL - 通过HTML锚元素发现源URL
获取HTML元素的锚元素,并返回包含rss
的URL - 通过Feedly发现源URL
使用Feedly API获取源URL
discoverFavicon(string $url): ?string
获取源的网站favicon。如果没有找到,则返回 null
。
checkIfConsumableFeed(string $url): bool
检查给定的URL是否是可消费的RSS源。
贡献
发现了任何问题或有改进爬虫的想法?请随时提交问题或pull请求。
未来计划
- 添加Laravel门面