tourze / rss-feed-collect-bundle
Installs: 0
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/tourze/rss-feed-collect-bundle
Requires
- doctrine/dbal: ^4.0
- doctrine/doctrine-bundle: ^2.13
- doctrine/orm: ^3.0
- doctrine/persistence: ^4.1
- easycorp/easyadmin-bundle: ^4
- knplabs/knp-menu: ^3.7
- monolog/monolog: ^3.1
- psr/log: ^3|^2|^1
- symfony/config: ^7.3
- symfony/console: ^7.3
- symfony/dependency-injection: ^7.3
- symfony/doctrine-bridge: ^7.3
- symfony/event-dispatcher: ^7.3
- symfony/framework-bundle: ^7.4
- symfony/http-client: ^7.3
- symfony/http-client-contracts: ^3.6
- symfony/http-foundation: ^7.4
- symfony/http-kernel: ^7.3
- symfony/messenger: ^7.3
- symfony/monolog-bundle: ^3.10
- symfony/property-access: ^7.3
- symfony/validator: ^7.3
- symfony/yaml: ^7.3
- tourze/bundle-dependency: 1.*
- tourze/doctrine-indexed-bundle: 1.0.*
- tourze/doctrine-timestamp-bundle: 1.1.*
- tourze/easy-admin-menu-bundle: 1.0.*
- tourze/symfony-dependency-service-loader: 1.0.*
Requires (Dev)
This package is auto-updated.
Last update: 2025-12-20 18:12:42 UTC
README
RSS源抓取收集Bundle,提供定时抓取RSS源内容并存储到数据库的功能。
核心功能
- RSS源管理: 支持多个RSS源的配置和管理
- 自动抓取: 基于配置的间隔时间自动抓取RSS内容
- 智能去重: 基于文章链接自动去重,避免重复存储
- 状态管理: 跟踪每个RSS源的抓取状态和错误信息
- Console命令: 支持手动触发和批量抓取
快速开始
1. 安装依赖
composer install
2. 运行数据迁移
php bin/console doctrine:migrations:migrate
3. 加载测试数据
php bin/console doctrine:fixtures:load
4. 执行RSS抓取
# 抓取单个RSS源 (必须指定feed-id) php bin/console rss:collect-feed --feed-id=1 # 强制抓取单个RSS源 php bin/console rss:collect-feed --feed-id=1 --force # 抓取所有到期的RSS源 php bin/console rss:collect-feeds # 强制抓取所有活跃RSS源 php bin/console rss:collect-feeds --force # 查看统计信息 php bin/console rss:collect-feeds --stats
测试用RSS源
Bundle预置了百度科技新闻RSS源用于真实测试:
- 名称: 百度-科技最新
- URL: https://news.baidu.com/n?cmd=4&class=technnews&tn=rss
- 抓取间隔: 30分钟
- 用途: 可发起真实HTTP请求进行功能验证
架构设计
实体结构
RssFeed (RSS源)
├── id: 主键
├── name: RSS源名称
├── url: RSS源URL地址
├── category: 分类
├── collectIntervalMinutes: 抓取间隔(分钟)
├── status: 状态(active/error/disabled)
├── lastCollectTime: 最后抓取时间
├── lastError: 最后错误信息
└── itemsCount: 文章总数
RssItem (RSS文章)
├── id: 主键
├── title: 文章标题
├── link: 文章链接 (去重键)
├── description: 文章描述
├── content: 文章内容
├── guid: 文章GUID
├── publishTime: 发布时间
└── rssFeed: 关联RSS源
服务层
RssFeedCollectService: 核心抓取服务,处理HTTP请求、XML解析、数据存储RssFeedRepository: RSS源数据访问层RssItemRepository: RSS文章数据访问层
Console命令
rss:collect-feed
单个RSS源抓取命令,专门处理指定RSS源的抓取。
# 抓取指定RSS源 php bin/console rss:collect-feed --feed-id=1 # 强制抓取(忽略抓取间隔) php bin/console rss:collect-feed --feed-id=1 --force
rss:collect-feeds
批量RSS源抓取命令,遍历所有RSS源并执行抓取。
# 抓取所有到期的RSS源 php bin/console rss:collect-feeds # 强制抓取所有活跃RSS源 php bin/console rss:collect-feeds --force # 查看统计信息 php bin/console rss:collect-feeds --stats
环境配置
# RSS抓取超时时间(秒),默认30 RSS_COLLECT_TIMEOUT=30 # RSS抓取User-Agent,默认"RSS Feed Collector Bot/1.0" RSS_COLLECT_USER_AGENT="RSS Feed Collector Bot/1.0"
运行测试
# 运行所有测试 ./vendor/bin/phpunit # 运行静态分析 php -d memory_limit=2G vendor/bin/phpstan analyse --level=8
使用示例
添加新的RSS源
$rssFeed = new RssFeed(); $rssFeed->setName('技术博客'); $rssFeed->setUrl('https://example.com/feed.xml'); $rssFeed->setCategory('技术'); $rssFeed->setCollectIntervalMinutes(60); $rssFeed->setIsActive(true); $entityManager->persist($rssFeed); $entityManager->flush();
手动抓取RSS源
$collectService = $container->get(RssFeedCollectService::class); $result = $collectService->collectFeed($rssFeed); if ($result['success']) { echo "抓取成功,新增文章: " . $result['items_count']; } else { echo "抓取失败: " . $result['error']; }