""" 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)