RSS是常用的内容聚合格式,很多网站的内容链接会附带动态参数,比如用于分类筛选的category参数、用于追踪用户的utm参数、用于标识内容版本的时间戳参数等。这些动态参数如果处理不当,会导致RSS订阅内容重复、链接失效或者解析出错,因此需要针对性处理。

生成RSS时处理动态参数
当我们需要自己生成RSS订阅源时,首先要对内容链接中的动态参数做筛选,保留有意义的参数,过滤掉无意义的追踪类参数,避免同一个内容生成多个不同的RSS条目。
参数过滤规则
- 保留内容标识类参数,比如文章ID、分类ID等,这类参数决定了内容的核心属性
- 过滤追踪类参数,比如utm_source、utm_medium等用于数据统计的参数,这类参数不影响内容本身
- 过滤临时类参数,比如时间戳、随机字符串等每次请求都会变化的参数
代码示例(Python)
以下是使用Python生成RSS时过滤动态参数的示例代码:
import feedgenerator
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
def filter_dynamic_params(url):
# 解析URL
parsed = urlparse(url)
# 解析查询参数
query_params = parse_qs(parsed.query)
# 需要保留的参数列表
keep_params = ['id', 'category', 'type']
# 过滤参数
filtered_params = {k: v for k, v in query_params.items() if k in keep_params}
# 重新拼接查询字符串
new_query = urlencode(filtered_params, doseq=True)
# 重新组装URL
new_url = urlunparse((parsed.scheme, parsed.netloc, parsed.path, parsed.params, new_query, parsed.fragment))
return new_url
# 生成RSS条目
item_url = 'https://ippipp.com/article?id=123&category=tech&utm_source=home&_t=1620000000'
filtered_url = filter_dynamic_params(item_url)
feed = feedgenerator.Rss201rev2Feed(
title='测试站点RSS',
link='https://ippipp.com',
description='测试RSS订阅源'
)
feed.add_item(
title='测试文章',
link=filtered_url,
description='这是一篇测试文章'
)
# 输出RSS内容
print(feed.writeString('utf-8'))
解析RSS时处理动态参数
当我们需要解析第三方提供的RSS内容时,也需要对条目链接中的动态参数做处理,避免同一个内容因为参数不同被识别为多个不同内容,同时可以提取参数中的有效信息。
提取有效参数信息
有些动态参数会携带内容的额外属性,比如分类信息、作者信息,我们可以在解析时提取这些参数,补充到RSS条目的元数据中。
代码示例(PHP)
以下是使用PHP解析RSS时处理动态参数的示例代码:
<?php
function parse_rss_item_params($url) {
$parsed = parse_url($url);
$params = [];
if (isset($parsed['query'])) {
parse_str($parsed['query'], $params);
}
// 提取有效参数
$result = [
'original_url' => $url,
'filtered_url' => '',
'category' => $params['category'] ?? '',
'author' => $params['author'] ?? ''
];
// 过滤无效参数,保留id和category
$keep_params = ['id', 'category'];
$filtered_query = [];
foreach ($params as $key => $value) {
if (in_array($key, $keep_params)) {
$filtered_query[$key] = $value;
}
}
// 重新拼接过滤后的URL
$parsed['query'] = http_build_query($filtered_query);
$result['filtered_url'] = unparse_url($parsed);
return $result;
}
// 辅助函数:重新组装URL
function unparse_url($parsed) {
$scheme = isset($parsed['scheme']) ? $parsed['scheme'] . '://' : '';
$host = $parsed['host'] ?? '';
$port = isset($parsed['port']) ? ':' . $parsed['port'] : '';
$path = $parsed['path'] ?? '';
$query = isset($parsed['query']) && $parsed['query'] !== '' ? '?' . $parsed['query'] : '';
$fragment = isset($parsed['fragment']) ? '#' . $parsed['fragment'] : '';
return $scheme . $host . $port . $path . $query . $fragment;
}
// 测试解析
$item_url = 'https://ipipp.com/article?id=456&category=life&author=test&utm_medium=rss';
$parse_result = parse_rss_item_params($item_url);
print_r($parse_result);
?>
避免动态参数导致的重复内容问题
动态参数最常见的负面影响就是导致同一个内容生成多个RSS条目,我们可以通过以下方式避免这个问题:
- 在生成RSS时,对内容链接做参数标准化,统一过滤规则,保证同一个内容的链接唯一
- 在存储RSS条目时,使用过滤后的链接作为唯一标识,而不是原始链接
- 解析RSS时,先对链接做参数过滤,再去重,避免重复抓取同一个内容
注意事项
处理动态参数时需要注意,不要过度过滤,避免误删影响内容访问的必要参数。比如有些网站的会话参数、权限参数是访问内容必需的,这类参数需要保留。另外,不同站点的动态参数规则不同,处理第三方RSS时可以根据实际情况调整过滤规则,不要使用统一的过滤策略。