You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:30:52