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

定时抓取NOAA纯文本HTTPS页面及提取指定行数据的技术咨询

解决NOAA GOES X射线通量抓取与自动触发成像的方案

嘿,针对你遇到的两个问题,我整理了一套完整的解决方案,包括定时抓取、数据提取和触发成像的全流程,一起来看看:

1. 实现每60秒循环抓取页面

要定时重复抓取目标页面,最直接的方式是用time.sleep()配合无限循环,同时加上异常处理避免网络波动导致程序崩溃。另外提个小建议:这个页面是纯文本格式,完全不需要用BeautifulSoup(它是专门用来解析HTML/XML的工具),直接用urllib获取文本内容效率更高。

示例循环逻辑:

import time
import urllib.request

while True:
    try:
        # 抓取页面内容并转成字符串
        response = urllib.request.urlopen("https://services.swpc.noaa.gov/text/goes-xray-flux-primary.txt")
        text_content = response.read().decode('utf-8')
        
        # 这里加入后续的行提取和判断逻辑
        
        print("抓取完成,等待下一次检查...")
        time.sleep(60)  # 等待60秒再执行下一次循环
    except Exception as e:
        print(f"抓取出错: {e},10秒后重试")
        time.sleep(10)  # 出错后先等10秒再重试,避免频繁请求

2. 无需本地保存提取指定行数据

因为页面是纯文本结构,我们可以直接按行拆分内容,过滤掉开头的注释行(以#开头的行),然后提取第一行有效数据:

# 接上面的text_content变量
lines = text_content.splitlines()
first_data_line = None

# 遍历行,找到第一行非注释的有效数据
for line in lines:
    line = line.strip()
    if line and not line.startswith('#'):
        first_data_line = line
        break

if first_data_line:
    # 按空格分割数据(split()会自动处理连续空格)
    data = first_data_line.split()
    # 对应表头:YR MO DA HHMM Day Day Short Long
    short_flux = float(data[6])
    long_flux = float(data[7])
    print(f"当前Short X射线通量: {short_flux}, Long X射线通量: {long_flux}")

3. 结合PyAutoGUI触发CCD成像应用

当通量达到阈值(1e-4及以上)时,用PyAutoGUI触发应用。如果应用有全局快捷键,直接模拟按键即可;如果需要更稳定的启动方式,也可以结合subprocess直接启动程序路径(两种方式都给你列出来了):

先安装PyAutoGUI:pip install pyautogui

示例触发逻辑:

import pyautogui
import subprocess

# 替换成你的CCD成像应用路径或快捷键
APP_PATH = "C:/Path/To/Your/CCD_App.exe"
# 示例快捷键:Ctrl+Shift+C
# SHORTCUT_KEYS = ['ctrl', 'shift', 'c']

if short_flux >= 1e-4 or long_flux >= 1e-4:
    print("通量达到阈值,启动CCD成像序列!")
    # 方式1:直接启动程序(推荐,更稳定)
    subprocess.Popen(APP_PATH)
    # 方式2:模拟快捷键(如果应用支持全局快捷键)
    # pyautogui.hotkey(*SHORTCUT_KEYS)

完整整合代码

把上面的部分整合起来,就是完整的工作流程:

import time
import urllib.request
import pyautogui
import subprocess

# 配置参数
TARGET_URL = "https://services.swpc.noaa.gov/text/goes-xray-flux-primary.txt"
CHECK_INTERVAL = 60  # 60秒检查一次
FLUX_THRESHOLD = 1e-4  # 触发阈值
APP_PATH = "C:/Path/To/Your/CCD_App.exe"  # 替换成你的CCD应用路径

def fetch_and_check_flux():
    try:
        response = urllib.request.urlopen(TARGET_URL)
        text_content = response.read().decode('utf-8')
        lines = text_content.splitlines()
        
        # 找第一行有效数据
        first_data_line = None
        for line in lines:
            line = line.strip()
            if line and not line.startswith('#'):
                first_data_line = line
                break
        
        if not first_data_line:
            print("未找到有效数据行")
            return
        
        # 解析数据并判断阈值
        data = first_data_line.split()
        if len(data) < 8:
            print("数据格式异常")
            return
        
        short_flux = float(data[6])
        long_flux = float(data[7])
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Short: {short_flux}, Long: {long_flux}")
        
        if short_flux >= FLUX_THRESHOLD or long_flux >= FLUX_THRESHOLD:
            print("通量超标,启动CCD成像!")
            subprocess.Popen(APP_PATH)
            # 可选:添加冷却时间,避免短时间内多次触发
            time.sleep(300)  # 5分钟内不再触发,可按需调整
            
    except Exception as e:
        print(f"处理出错: {str(e)}")

if __name__ == "__main__":
    print("启动NOAA X射线通量监控程序...")
    while True:
        fetch_and_check_flux()
        time.sleep(CHECK_INTERVAL)

一些实用提示

  • 如果你坚持要用BeautifulSoup,调用soup.get_text()也能拿到纯文本内容,但没必要多此一举。
  • 网络异常处理很关键,能避免一次断网就导致程序终止。
  • 触发应用后添加冷却时间,可以防止短时间内通量波动导致重复启动。
  • PyAutoGUI在后台运行时可能受系统权限影响,建议以管理员身份运行脚本。

内容的提问来源于stack exchange,提问作者Walter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:32