133 lines
6.0 KiB
Python
133 lines
6.0 KiB
Python
"""
|
||
xwlb_daily 表结构如下:
|
||
+--------------+---------+------+-----+---------+----------------+
|
||
| Field | Type | Null | Key | Default | Extra |
|
||
+--------------+---------+------+-----+---------+----------------+
|
||
| nid | int(11) | NO | PRI | NULL | auto_increment |
|
||
| news_days | date | NO | | NULL | |
|
||
| daily_sub_id | int(11) | NO | | NULL | |
|
||
| news_raw | text | NO | | NULL | |
|
||
| news_improve | text | NO | | NULL | |
|
||
| news_title | text | NO | | NULL | |
|
||
+--------------+---------+------+-----+---------+----------------+
|
||
xwlb_daily_ext 表结构如下:
|
||
+--------------+--------------+------+-----+---------+----------------+
|
||
| Field | Type | Null | Key | Default | Extra |
|
||
+--------------+--------------+------+-----+---------+----------------+
|
||
| extid | int(11) | NO | PRI | NULL | auto_increment |
|
||
| news_date | date | NO | | NULL | |
|
||
| sub_id | tinyint(4) | NO | | NULL | |
|
||
| news_title | varchar(256) | NO | | NULL | |
|
||
| news_content | text | NO | | NULL | |
|
||
+--------------+--------------+------+-----+---------+----------------+
|
||
|
||
获取给定日期的所有news_improve字段内容,以daily_sub_id 顺序拼接为一个字符串返回。
|
||
调用mysqlHandler中的方法执行SQL查询。
|
||
"""
|
||
from mysqlHandle import MySQLDB
|
||
from deepseek import deepseek_text
|
||
import json
|
||
import logging
|
||
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
logger = logging.getLogger(__name__)
|
||
|
||
def get_news_improve_by_date(target_date):
|
||
"""
|
||
获取指定日期的所有news_improve内容,按daily_sub_id顺序拼接
|
||
|
||
Args:
|
||
target_date: 目标日期,格式为'YYYY-MM-DD'
|
||
|
||
Returns:
|
||
str: 拼接后的字符串
|
||
"""
|
||
try:
|
||
# 创建数据库连接对象
|
||
db = MySQLDB()
|
||
# 查询目标日期在xwlb_daily_ext表中的记录数量
|
||
count_result = db.query_data(
|
||
table="xwlb_daily_ext",
|
||
columns="COUNT(*) as count",
|
||
where="news_date = %s",
|
||
params=(target_date,)
|
||
)
|
||
# 如果记录数量存在且大于5条,则返回空字符串
|
||
if count_result and count_result[0]['count'] > 5:
|
||
return None
|
||
# 重新创建数据库连接对象,因为每次查询都会关闭连接
|
||
db = MySQLDB()
|
||
# 查询目标日期在xwlb_daily表中的news_improve字段,按daily_sub_id升序排列
|
||
result = db.query_data(
|
||
table="xwlb_daily",
|
||
columns="news_improve",
|
||
where="news_days = %s order by daily_sub_id ASC",
|
||
params=(target_date,))
|
||
# 如果查询结果不为空
|
||
if result:
|
||
# 将每条记录的news_improve字段用换行符连接成字符串
|
||
combined_content = '\n'.join([row['news_improve'] for row in result])
|
||
# 返回拼接后的字符串
|
||
return combined_content
|
||
# 查询结果为空时返回空字符串
|
||
return None
|
||
except Exception as e:
|
||
#print(f"查询失败: {e}")
|
||
logger.error(f"查询失败: {e}")
|
||
return None
|
||
|
||
def news_to_db(target_date):
|
||
result = get_news_improve_by_date(target_date)
|
||
if result is None:
|
||
logger.warning(f"日期 {target_date} 没有新闻内容或者已经存在处理后的记录。跳过")
|
||
return None
|
||
logger.info(f"日期 {target_date} 的新闻内容长度:{len(result)} 字符")
|
||
|
||
prompt= "###请根据下面新闻内容的文本逻辑 \n - 帮我分割成各个独立的新闻内容(注意:不要修改新闻本身,仅分割文本),并给每个新闻总结一个标题; \n - 如果遇到'国内快讯'、'国际快讯'或'联播快讯',也请根据每个条快讯分割为一个新闻以及新闻标题; \n - 返回json格式。json格式包含:news_id,news_title,news_content; news_id从1开始递增。"
|
||
try:
|
||
response = deepseek_text(result, prompt)
|
||
data = json.loads(response)
|
||
# DeepSeek json_object 模式返回的是 dict(如 {"news": [...]}),
|
||
# 普通模式返回的是纯数组 [...],这里做自适应提取
|
||
if isinstance(data, dict):
|
||
# 从 dict 中提取列表:找第一个 list 类型的 value
|
||
news_list = None
|
||
for v in data.values():
|
||
if isinstance(v, list):
|
||
news_list = v
|
||
break
|
||
if news_list is None:
|
||
# 所有 value 都不是 list,可能是 {"1": {...}, "2": {...}} 格式
|
||
news_list = list(data.values())
|
||
elif isinstance(data, list):
|
||
news_list = data
|
||
else:
|
||
raise ValueError(f"不支持 DeepSeek 响应格式: {type(data)}")
|
||
|
||
db = MySQLDB()
|
||
for news in news_list:
|
||
db.insert_data(
|
||
table="xwlb_daily_ext",
|
||
data={
|
||
"news_date": target_date,
|
||
"sub_id": news["news_id"],
|
||
"news_title": news["news_title"][:256], # 确保不超过varchar(256)限制
|
||
"news_content": news["news_content"]
|
||
}
|
||
)
|
||
logger.info(f"成功插入 {len(news_list)} 条新闻到数据库")
|
||
except json.JSONDecodeError as e:
|
||
logger.error(f"JSON解析失败: {e}")
|
||
logger.error(f"DeepSeek API返回内容: {response}")
|
||
except Exception as e:
|
||
logger.error(f"插入数据库失败: {e}")
|
||
#print(f"DeepSeek API返回结果:{response}")
|
||
|
||
if __name__ == "__main__":
|
||
import sys
|
||
from datetime import datetime
|
||
#提供日期参数,格式:YYYY-MM-DD
|
||
|
||
target_date = datetime.now().strftime('%Y-%m-%d')
|
||
news_to_db(target_date)
|