Python如何快速获取RSS源最新文章标题 避免加载完整订阅源
实现RSS源低耗时部分请求的方案
完全可以实现只请求部分内容拿到标题,RSS是标准XML结构,文章标题基本都出现在文件前半段,你可以用以下两种方案实现:
方案1:HTTP Range请求(服务端支持时效率最高)
通过HTTP请求头的Range字段直接指定需要获取的字节范围,服务端会只返回你需要的内容段,不需要传输完整文件:
- 核心逻辑:通常前2048字节就可以覆盖绝大多数RSS源的前5~10篇文章标题,足够常规轮询使用
- 示例代码:
import requests RSS_URL = "替换为你的RSS源地址" # 定义需要请求的字节范围,0-2047就是前2048字节 headers = {"Range": "bytes=0-2047"} resp = requests.get(RSS_URL, headers=headers, timeout=3) # 206状态码代表服务端支持Range请求,返回了部分内容 content = resp.text if resp.status_code == 206 else resp.text[:2048] # 后续直接解析content里的<title>标签即可
方案2:流式请求动态中断(通用性更强,不需要服务端支持)
如果目标RSS源不支持Range请求,可以用流式传输的方式逐块接收内容,只要拿到所有需要的标题就直接断开连接,不会继续下载剩余内容:
- 核心逻辑:开启流式请求后逐块加载内容,边加载边解析标题,满足需求立刻终止请求,避免无用流量消耗
- 示例代码:
import requests from xml.etree import ElementTree as ET def fetch_rss_titles(rss_url, title_count=5): buffer = "" titles = [] # 开启流式请求,不预先加载完整响应 with requests.get(rss_url, stream=True, timeout=3) as resp: resp.encoding = resp.apparent_encoding # 每次只加载128字节,你可以根据需求调整块大小 for chunk in resp.iter_content(chunk_size=128, decode_unicode=True): buffer += chunk # 尝试解析当前缓冲区的XML提取标题 try: root = ET.fromstring(buffer) # 同时适配RSS2.0和Atom格式的标题字段 items = root.findall(".//item") + root.findall(".//{http://www.w3.org/2005/Atom}entry") for item in items: title_tag = item.find("title") or item.find("{http://www.w3.org/2005/Atom}title") if title_tag is not None and title_tag.text not in titles: titles.append(title_tag.text) if len(titles) >= title_count: break if len(titles) >= title_count: break except ET.ParseError: # XML未接收完整导致解析失败属于正常情况,继续加载下一块即可 continue return titles
优化建议
- 如果需要同时轮询大量RSS源,可以把同步的requests换成异步
aiohttp的流式请求,并发效率会提升数倍 - 可以针对你常用的RSS源统计标题出现的字节位置,动态调整请求的字节上限,进一步降低耗时
内容的提问来源于stack exchange,提问作者amiller3513
相关产品推荐
相关产品推荐

