Python网页爬虫循环更新异常 首次匹配文章后停止运行问题排查
无限定时刷新爬虫问题修复方案
核心错误点
你的代码存在5个直接导致运行失效的逻辑问题:
- RSS拉取、解析逻辑写在死循环外部,程序启动仅会请求一次站点feed,后续循环全程复用首次拉取的旧数据,根本不会获取站点最新发布的内容
find_new函数内的return url缩进错误,写在for循环遍历块内部,只要遍历到第一个符合关键词的条目就直接终止函数返回,不会遍历完所有feed条目,也不会处理后续发布的新内容- 匹配到新文章链接后,没有将链接存入已推送的
store_links列表,会导致同一篇文章重复触发推送 - 仅用单个变量
ol_news存储上一个链接,无法应对站点同时发布多篇新文章的场景,会出现内容漏判 - 代码中写的休眠间隔是2秒,和你预期的5秒刷新间隔不符
修正后可直接运行的代码
from bs4 import BeautifulSoup import requests import time import webbrowser import winsound # 匹配关键词配置,可自行修改 KEYWORDS = {"and", "or", "man", "said", "is", "the", "on"} # 刷新间隔配置,单位:秒 REFRESH_INTERVAL = 5 def fetch_latest_feed(): """每次调用重新拉取站点最新RSS内容并解析""" try: resp = requests.get('https://nypost.com/feed/', timeout=10) resp.raise_for_status() xml_text = resp.text.lower() return BeautifulSoup(xml_text, 'xml') except Exception as e: print(f"拉取内容失败,等待下次重试,错误信息:{str(e)}") return None def check_new_articles(pushed_links): soup = fetch_latest_feed() if not soup: return # 遍历所有feed条目 for item in soup.select('item'): title = item.title.text url = item.link.text # 已推送过的链接直接跳过 if url in pushed_links: continue # 标题命中关键词则触发推送 if any(keyword in title for keyword in KEYWORDS): print(f"\n命中新文章:{title}") print(f"文章链接:{url}") # 新标签页打开文章 webbrowser.open(url, new=2) # 异步播放提示音,不阻塞主循环 winsound.PlaySound("notify.wav", winsound.SND_ASYNC) # 记录已推送链接,避免重复提醒 pushed_links.add(url) if __name__ == '__main__': # 用集合存储已推送链接,去重判断效率更高 pushed_links = set() print(f"爬虫已启动,每{REFRESH_INTERVAL}秒刷新一次,命中关键词的新文章将自动提醒") while True: check_new_articles(pushed_links) time.sleep(REFRESH_INTERVAL)
关键改动说明
- 把RSS拉取解析逻辑封装为独立函数,每次循环都会重新请求站点获取最新内容
- 修正返回语句缩进,函数会遍历完所有feed条目后再退出,不会提前终止
- 改用集合存储已推送的文章链接,去重判断效率更高,匹配到新文章后自动加入集合避免重复推送
- 将关键词、刷新间隔抽为全局常量,后续修改配置无需改动核心逻辑
- 增加简单的请求异常捕获,网络波动时程序不会直接崩溃,会自动等待下一轮重试
- 提示音播放改为异步模式,播放音效时不会阻塞主循环运行
- 删除原代码中未使用的冗余导入、无效变量
内容的提问来源于stack exchange,提问作者pilotso
相关产品推荐
相关产品推荐

