2026-01-08 14:26:34 +08:00
|
|
|
|
# services/crawler_82.py
|
2026-01-08 13:53:19 +08:00
|
|
|
|
import requests
|
|
|
|
|
|
import json
|
|
|
|
|
|
import logging
|
|
|
|
|
|
from lxml import etree
|
|
|
|
|
|
from config import Config
|
2026-01-08 14:26:34 +08:00
|
|
|
|
from datetime import datetime
|
2026-01-08 13:53:19 +08:00
|
|
|
|
|
|
|
|
|
|
CONFIG = Config.CRAWLER_CONFIG["82"]
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-08 14:26:34 +08:00
|
|
|
|
def run_82_logic():
|
|
|
|
|
|
"""返回 result_list"""
|
|
|
|
|
|
results = []
|
2026-01-08 13:53:19 +08:00
|
|
|
|
print(">>> [82爬虫] 启动...")
|
2026-01-08 14:26:34 +08:00
|
|
|
|
session = requests.Session()
|
|
|
|
|
|
|
2026-01-08 13:53:19 +08:00
|
|
|
|
try:
|
|
|
|
|
|
session.post(f"{CONFIG['base_url']}/login.php", data=CONFIG["login"], timeout=10)
|
|
|
|
|
|
resp = session.post(f"{CONFIG['base_url']}/GetStationList.php", timeout=10)
|
|
|
|
|
|
html = etree.HTML(resp.content)
|
2026-01-08 14:26:34 +08:00
|
|
|
|
if html is None: return []
|
2026-01-08 13:53:19 +08:00
|
|
|
|
|
|
|
|
|
|
stations = html.xpath('//option/@value')
|
|
|
|
|
|
for sid in [s for s in stations if s]:
|
2026-01-08 14:26:34 +08:00
|
|
|
|
data_packet = {
|
|
|
|
|
|
'source': '82网站',
|
|
|
|
|
|
'name': str(sid),
|
|
|
|
|
|
'status': '正常',
|
|
|
|
|
|
'value': '',
|
2026-09-15 17:05:31 +08:00
|
|
|
|
# 同 106:默认留空,只有真正拿到数据时间才覆盖,
|
|
|
|
|
|
# 不用 datetime.now() 冒充数据时间
|
|
|
|
|
|
'target_time': None,
|
2026-01-08 14:26:34 +08:00
|
|
|
|
'raw_json': {},
|
|
|
|
|
|
'temp_file': None
|
|
|
|
|
|
}
|
2026-01-08 13:53:19 +08:00
|
|
|
|
try:
|
|
|
|
|
|
r = session.post(f"{CONFIG['base_url']}/getLastWeatherData.php", data=str(sid),
|
|
|
|
|
|
headers={'Content-Type': 'text/plain'}, timeout=10)
|
|
|
|
|
|
try:
|
|
|
|
|
|
data = r.json()
|
2026-01-08 14:26:34 +08:00
|
|
|
|
except:
|
2026-01-08 13:53:19 +08:00
|
|
|
|
data = None
|
|
|
|
|
|
|
|
|
|
|
|
if data:
|
|
|
|
|
|
d_list = data.get('date', [])
|
2026-09-15 17:05:31 +08:00
|
|
|
|
# 拿不到时间时必须是 None,不能是 "N/A" —— 字符串在入库层是真值,
|
|
|
|
|
|
# 会把设备主表已经冻结的有效 latest_time 覆盖掉,令 offset 倒退成"从未同步"
|
|
|
|
|
|
latest = str(d_list[-1]) if d_list else None
|
2026-01-08 14:26:34 +08:00
|
|
|
|
data_packet['target_time'] = latest
|
|
|
|
|
|
data_packet['value'] = f"Data Points: {len(d_list)}"
|
|
|
|
|
|
data_packet['raw_json'] = data # 🔥 存完整JSON
|
2026-01-08 13:53:19 +08:00
|
|
|
|
else:
|
2026-01-08 14:26:34 +08:00
|
|
|
|
data_packet['status'] = '异常'
|
|
|
|
|
|
data_packet['value'] = "返回空数据"
|
|
|
|
|
|
|
2026-01-08 13:53:19 +08:00
|
|
|
|
except Exception as e:
|
2026-01-08 14:26:34 +08:00
|
|
|
|
data_packet['status'] = '异常'
|
|
|
|
|
|
data_packet['value'] = "单个采集失败"
|
|
|
|
|
|
|
|
|
|
|
|
results.append(data_packet)
|
2026-01-08 13:53:19 +08:00
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
2026-01-08 14:26:34 +08:00
|
|
|
|
logging.error(f"82 Crawler Error: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
return results
|