From 5eb92268ec2ccaecc9afc8143f88ff0e36ade44d Mon Sep 17 00:00:00 2001 From: shenjianZ Date: Thu, 15 Jan 2026 22:04:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=96=B0=E5=8D=8E?= =?UTF-8?q?=E7=BD=91=E6=94=BF=E5=8A=A1=E5=88=86=E7=B1=BB=E7=88=AC=E8=99=AB?= =?UTF-8?q?=20=E4=B8=8D=E9=9B=86=E6=88=90=E5=88=B0=E7=88=AC=E8=99=AB?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crawler-module/.gitignore | 1 + crawler-module/xinhuanet.py | 177 +++++++++++++++++++++++++++ ml-module/src/traditional/predict.py | 103 +++++++++++----- 3 files changed, 248 insertions(+), 33 deletions(-) create mode 100644 crawler-module/xinhuanet.py diff --git a/crawler-module/.gitignore b/crawler-module/.gitignore index 1bf910f..226a5f8 100644 --- a/crawler-module/.gitignore +++ b/crawler-module/.gitignore @@ -47,3 +47,4 @@ Thumbs.db # Project specific config/local.yaml *.local.yaml +example \ No newline at end of file diff --git a/crawler-module/xinhuanet.py b/crawler-module/xinhuanet.py new file mode 100644 index 0000000..31ba59f --- /dev/null +++ b/crawler-module/xinhuanet.py @@ -0,0 +1,177 @@ +import json +import os +import sys +import requests +from bs4 import BeautifulSoup + +# 添加项目路径 +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from src.database.repository import NewsRepository +from src.database.models import NewsModel +from src.utils.logger import get_logger + +# 配置 +FILE_PATH = "example/02.json" +ARTICLE_PREFIX_URL = 'https://www.xinhuanet.com' +CATEGORY_ID = 7 # 政务分类 +SOURCE = "新华网" + +# 爬取控制参数 +START = 100 # 从第几条开始(0 表示从第一条开始,索引从 0 开始) +COUNT = 200 # 爬取多少条(设置为 None 或 0 表示爬取所有) + +# 请求头 +HEADERS = { + "User-Agent": ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/120.0.0.0 Safari/537.36" + ) +} + +# 初始化日志 +logger = get_logger(__name__) + + +def parse_article(href: str) -> str: + """ + 解析文章详情页,提取正文内容 + + Args: + href: 文章URL + + Returns: + 文章正文内容 + """ + try: + resp = requests.get(href, headers=HEADERS, timeout=10) + resp.raise_for_status() + html = resp.text + soup = BeautifulSoup(html, "lxml") + + # 提取正文容器 + content_node = soup.find(id="detailContent") + + if content_node: + # 获取文本并进行清洗 + content = content_node.get_text(separator='\n', strip=True) + return content + else: + logger.warning(f"未找到正文内容: {href}") + return "" + + except Exception as e: + logger.error(f"解析文章失败: {href} - {e}") + return "" + + +def main(): + """主函数""" + # 检查文件是否存在 + if not os.path.exists(FILE_PATH): + logger.error(f"找不到文件: {FILE_PATH}") + return + + # 初始化数据库仓库 + repository = NewsRepository() + + try: + # 1. 读取并解析 JSON + with open(FILE_PATH, 'r', encoding='utf-8') as f: + data = json.loads(f.read()) + + # 获取数据源 + datasource_list = data.get("datasource", []) + + # 计算爬取范围 + total_count = len(datasource_list) + end_index = START + COUNT if COUNT and COUNT > 0 else total_count + + # 验证参数 + if START >= total_count: + logger.error(f"起始索引 {START} 超出数据范围(总共 {total_count} 条)") + return + + if end_index > total_count: + end_index = total_count + logger.warning(f"请求的爬取数量超出数据范围,将爬取到第 {total_count} 条") + + actual_count = end_index - START + logger.info(f"数据范围: 第 {START} 条到第 {end_index - 1} 条(共 {actual_count} 条)") + + # 用于存储提取后的结果 + extracted_results = [] + + # 2. 遍历与清洗提取(使用切片控制范围) + for item in datasource_list[START:end_index]: + # 只保留 MultiMedia 类型的有效新闻 + if item.get("contentType") == "MultiMedia": + # 提取指定字段 + record = { + "title": item.get("title", "").strip(), + "href": ARTICLE_PREFIX_URL + item.get("publishUrl", "").strip(), + "author": item.get("sourceText", "").strip(), + "publish_time": item.get("publishTime", "").strip(), + } + + extracted_results.append(record) + + logger.info(f"处理完成!共提取到 {len(extracted_results)} 条有效数据") + + # 3. 解析文章详情并保存到数据库 + news_list = [] + success_count = 0 + fail_count = 0 + + for i, res in enumerate(extracted_results): + logger.info(f"[{i+1}/{len(extracted_results)}] 正在处理: {res['title']}") + + # 解析文章正文 + content = parse_article(res['href']) + + if not content: + logger.warning(f"文章正文为空,跳过: {res['href']}") + fail_count += 1 + continue + + # 创建新闻模型 + news = NewsModel( + url=res['href'], + title=res['title'], + content=content, + category_id=CATEGORY_ID, + source=SOURCE, + publish_time=res['publish_time'], + author=res['author'], + ) + + news_list.append(news) + success_count += 1 + + # 4. 批量保存到数据库 + if news_list: + inserted_count = repository.save_news(news_list) + logger.info(f"成功保存 {inserted_count} 条新闻到数据库") + else: + logger.warning("没有有效数据需要保存") + + # 5. 打印统计信息 + print("\n" + "=" * 50) + print("处理完成!统计信息:") + print(f" 数据总条数: {total_count}") + print(f" 爬取范围: 第 {START} 条到第 {end_index - 1} 条") + print(f" 实际处理: {len(extracted_results)}") + print(f" 成功解析: {success_count}") + print(f" 解析失败: {fail_count}") + print(f" 保存到数据库: {inserted_count if news_list else 0}") + print("=" * 50) + + except json.JSONDecodeError: + logger.error("JSON 格式错误,请检查文件内容") + except Exception as e: + logger.error(f"发生未知错误: {e}", exc_info=True) + + +if __name__ == "__main__": + main() diff --git a/ml-module/src/traditional/predict.py b/ml-module/src/traditional/predict.py index 6327fdb..a8d0a7b 100644 --- a/ml-module/src/traditional/predict.py +++ b/ml-module/src/traditional/predict.py @@ -117,66 +117,103 @@ def print_probabilities_table(probabilities: Dict[str, float]): if __name__ == '__main__': # 测试 result = predict_single( - title="BBA在华销量,跌回七八年前", + title="白鹿给助理全款提车,又把我羡慕哭了", content=""" - 中新经纬1月15日电 (龚宸芫)近日,BBA(宝马、奔驰、奥迪)公布了2025年全球销量。数据显示,宝马集团全球销量为246.37万辆,同比微增0.5%;梅赛德斯-奔驰全球销量为216万辆,同比下降10%;奥迪全球销量为162.36万辆,同比下降2.9%。 -  聚焦中国市场,宝马中国2025年销量为62.55万辆,同比下滑12.5%。奔驰中国销量为57.5万辆,同比下滑19.5%。奥迪中国销量为61.75万辆,同比下滑5%。同2024年相比,三家车企销量减幅合计接近26万辆。 -  上述数据显示,2025年,BBA中国市场销量水平回到了七八年前。 -  根据各家官网披露的数据,宝马、奔驰、奥迪2018年在华销量分别为64万辆、67.41万辆,以及66.09万辆,2017年则分别为59.44万辆、58.79万辆,以及59.79万辆。 -BBA近十年在华销量 中新经纬制图 -  部分主销车型每月少卖近3000辆 +“又是恨自己闺蜜不争气的一天。” -  虽然奔驰和宝马在华销量下降幅度都超过了10%,但从官方数据来看,其最大的单一市场还是中国。其中,宝马中国在其全球销量体系中占比为25.4%,奔驰中国在其全球销量体系中占比为26.5%。 +这句话,是不是也悄悄戳中过你的心?不过别急,我今天要讲的这个故事,可能刚好相反。两个女孩,一个成了万众瞩目的明星,另一个则默默站在她身后,却活成了许多人眼中“最争气的闺蜜”模样。 -  谈及中国市场销量下滑原因,奔驰给出的解释是,其在中国市场面临豪华车市场结构性波动及自身产品周期调整等挑战。 +图片 -  中国汽车流通协会专家委员会委员章弘告诉中新经纬,中国品牌产销量迅速增长,尤其是新能源品牌在30万元以上市场中抢占份额,直接挑战了BBA原有地位。此外,特斯拉等品牌在新能源领域的布局也对BBA形成压力,尤其在中高端市场,特斯拉的产品力和品牌影响力都在逐渐增强。 +【1】 -  比如,根据懂车帝统计的终端数据,问界M9自2025年3月底上市以来,持续在50万元以上的SUV市场取得头部表现,全年销量接近12万辆。而与之价格相接近的宝马X5,全年销量为7.01万辆,比2024年低1.7万辆。 +最近有个热搜,看得我心里暖烘烘的,又忍不住感慨:呵呵的命,真是有点好啊。 -  “BBA电动化转型滞后也是其销量下滑的原因之一,BBA的新能源车型占比相对较低,奔驰纯电动车占比仅8.1%,奥迪也刚过12.9%,而中国市场新能源渗透率已达47%。消费者对新能源车型的需求增长,使得BBA的传统燃油车优势逐渐减弱。”章弘说。 +这里说的“呵呵”,可不是语气词,而是从素人时期就相伴白鹿至今的闺蜜。两人的友谊一路走来,不仅是粉丝,连不少路人都津津乐道:原来在内娱,真的存在经得起时间与名利考验的神仙友情。 -  与2024年相比,从主销产品销量来看,根据第三方平台懂车帝数据,宝马、奔驰、奥迪在华各有不同表现。 +图片 -  其中,宝马中国主销轿车在2025年实现不同程度涨幅,而SUV普遍呈下降趋势。比如宝马3系2025年比2024年多卖了1.19万辆车,宝马5系多卖2.74万辆,而宝马X3 2025年比2024年少卖3.34万辆,宝马X1也少卖3万辆。 +时间倒回多年前。白鹿初入演艺圈,眼前是陌生的剧组、繁忙的行程和错综复杂的人际关系。彼时的她,还没有成熟的团队,身边也缺个信得过的自己人。迷茫与压力之下,她向闺蜜呵呵发出了邀请:你来帮我吧。 -  奔驰中国的主销车型,不管是SUV还是轿车,都有不同程度下滑,其中下滑最多的是奔驰C级,比2024年下降了3.54万辆,平均每个月少卖了0.295万辆。GLC则是2025年比2024年少卖了2.74万辆,奔驰E级和奔驰GLB分别少卖了1.47万辆和1.74万辆。 +没有太多犹豫,呵呵做出了一个改变人生轨迹的决定:辞去稳定的幼师工作,来到白鹿身边。放下熟悉的校园和孩子,踏入全然未知的内娱,这份勇气背后,是对朋友无条件的信任和支持。 -  奥迪中国是三家中下滑程度最轻的车企,变动最大的主销车型是奥迪A4L,从2024年的10.74万辆降至2025年的8万辆,少卖出2.74万辆。而其他大部分主销车型下降幅度在0.5万辆到1.5万辆之间。不过,奥迪A3销量实现了上涨,从2024年的5.48万辆增至2025年的6.68万辆,多卖了1.2万辆。 +图片 -  值得一提的是,公开资料显示,2025年年中,奥迪A3在终端市场曾进行了一次幅度较大的降价,该车指导价为16.59万到20.99万元,当时在4S店端裸车价跌破13万元,根据各大购车平台显示的车主成交价,最低成交价为11万元出头,比官方指导价低5万元。 +那时候的白鹿,还不是如今闪耀的90小花,只是无数怀揣梦想的年轻人中的一个;而呵呵,也并非专业的助理或经纪人,她只是一个决定陪朋友“闯一闯”的普通女孩。 -  “汽车市场的价格体系与性价比正在发生变化,BBA入门级车型在20万~40万元区间面临中国品牌的激烈竞争,价格优势不再明显。消费者在购车时更注重性价比,中国品牌在配置、智能化等方面的表现更具吸引力。并且,BBA部分车型存在配置选装费用较高的问题,导致实际购车成本上升,进一步削弱竞争力。此外,消费者需求变化、市场环境与政策调整,都会影响到BBA销量。”章弘分析道。 +翻看白鹿早期的剧组花絮和路透照片,几乎每一张里,都能找到呵呵的身影。她默默站在角落,提着包,拿着水,或者笑着看向镜头里的白鹿。那些影像记录下的,不仅是白鹿事业起步的点滴,更是两个人“共苦”时光最真实的注脚。 -  1月初,中新经纬探访位于北京的多家宝马4S店,看到大部分主销车型现车都有选装费用,如宝马5系、3系,即使是基础选装也会比裸车价格贵上万元。 +图片 -  三家均将推出多款新能源车 +图片 -  从公开披露的信息来看,BBA三家车企决定2026年继续加大投入中国市场,尤其在新能源车领域。 +【2】 -  宝马集团在2026年总体规划中提到,将为中国消费者带来约20款BMW、MINI和BMW摩托车新产品。其中,国产长轴距版新世代BMW iX3将于2026年上半年全球首发,并在下半年上市,该车将搭载宝马集团首创的全景iDrive、BMW新世代电驱系统、BMW驾控超级大脑等技术。 +娱乐圈是个名利场,也是个加速器。凭借努力和机遇,白鹿的事业逐渐走上正轨,人气攀升,一步步跻身当红小花行列。地位变了,环境变了,可身边的人却没变。呵呵依然在那里,身份却早已超越了普通的工作伙伴。 -  按照梅赛德斯-奔驰的计划,其2026年将向中国市场引入超15款全新和改款产品,覆盖新生代豪华、核心豪华和高端豪华细分市场,以及多种驱动方式。如旗下三大全新纯电架构平台MB.EA、AMG.EA、VAN.EA均有新车陆续亮相。 +白鹿从未亏待这位挚友。媒体报道中提到,她给呵呵开通了亲密付,待遇也是行业内顶尖的。但这些物质上的分享,或许只是她们感情最外显的一层。 -  对于奥迪中国而言,2026年亦是产品大年。其中,一汽奥迪在2025年底表示,2026年将推出全新奥迪Q5L、奥迪A6L e-tron、全新奥迪A6L等车型。 +真正难能可贵的,是那份始终如一的“视为自己人”的亲密与尊重。在复杂的内娱,能有一个站在你立场、为你着想、不计得失的自己人,是何其幸运又珍贵的事。 -  上汽奥迪计划在2026年推出‌奥迪E5 Sportback钦定性能quattro型、‌奥迪E7X等车型,后者计划于2026年北京车展亮相,并在同年上半年上市;此外,新品牌‌AUDI E SUV概念车的量产版也将在2026年上市。 +图片 -  BBA已做好进击准备,中国豪华市场2026年将迎来怎样的竞争格局? +而呵呵的付出,更是渗透在生活与事业的每一个细节里。 -  章弘认为,自主品牌在30万元以上高端市场占比将会持续提升,比亚迪、吉利、长安、奇瑞等传统车企通过高端子品牌与新势力车企共同发力,凭借电动化、智能化技术优势和本土化创新,抢占传统豪华品牌市场份额。 +生活上,她是白鹿的专属营养师。 -  “预计2026年自主高端车型销量占比将进一步扩大,形成与BBA等传统豪华品牌分庭抗礼的格局。传统豪华品牌将加速本土化研发,推出更多电动车型,只是产品竞争力仍需时间提升。部分品牌可能通过降价、优化渠道等方式维持甚至提高销量。”章弘表示。 +白鹿在剧组吃不好,呵呵二话不说,专门去学了烹饪。从此,白鹿的剧组餐,不再是统一的盒饭,而是呵呵亲手制作的、营养均衡的精致便当。每天清晨的厨房,夜晚保温盒里的汤水,藏着的都是无需言说的关怀。 -  公开资料显示,2026年开年之初,宝马中国宣布对旗下超30款主力车型进行建议零售价调整,其中24款车型的降幅超10%,6款超20%,部分车型最高官降30万元。 +图片 -  “我们对2026年中国豪华车市场保持审慎乐观态度,预计市场将延续2025年态势,整体竞争强度持续高位,市场整合与分化将进一步加剧。同时,2026年将是豪华车消费税起征点下调后的第一个完整实施年份,其对市场结构的深远影响将全面显现。在经历了前几年高速增长后,市场进入调整期是正常的。”近日,保时捷中国总裁潘励驰对中新经纬表示。 +事业上,她是白鹿的全能帮手和创意伙伴。 -  罗兰贝格1月8日发布的《预见2026:中国行业趋势报告》显示,从阵营格局看,新势力与民营企业的份额已分别从2023年的3.6%和24.6%上升至2025年的8.8%和33.1%,外资品牌份额则出现快速下滑。然而,这一趋势未必会持续放大。随着合资车企加强与本土供应链的合作,其在智能化方面的短板有望补足,市场份额或将逐步止跌回稳。 +面对完全陌生的宣传、拍摄、新媒体运营等领域,呵呵没有退缩。为了让白鹿呈现出更好的出片效果,她主动学习摄影、修图、剪辑。 -  聚焦BBA,章弘认为:“BBA也许会加速本土化转型,如加大电动化产品投放、提升智能化配置等,其市场份额下跌趋势可能得到一定遏制,跌幅较往年收窄。同时,BBA有可能会继续推进渠道优化,收缩低效能网点,同时加强数字化展厅建设和服务体验提升。” +图片 -  公开资料显示,2025年以来,BBA旗下多家中国4S店闭店。比如,2025年3月到8月,宝马中国撤销了数十家4S店的授权,其中包括北京最大的宝马4S店。2025年4月,奔驰宝利德旗下三家门店闭店。 +从构思到拍摄再到后期,没有专业团队,全靠她一点一点摸索、打磨。“让她更美,让她被更多人喜欢”的这份心意,化作了镜头里白鹿灵动鲜活的每一面。 + +白鹿那些点赞百万的爆款视频,很多都出自呵呵之手。 + +图片 + +【3】 + +去年十一月,两人的友谊迈入了第十个年头。十年,足以让山川易貌,让世事变迁,却没能改变她们之间那份纯粹的陪伴。 + +图片 + +图片 + +最近引发热议的“买车事件”,恰好为这段友谊添了一个温暖的注脚。 + +白鹿为呵呵购置了一辆车,这本是朋友间的馈赠,她们自己并未宣扬。消息的流出,竟源于卖车的店员被这份情谊打动而在网络分享。在店员和网友看来“堪称豪礼”的举动,于她们而言,或许只是漫长相处中一次自然而然的表达,“我觉得你需要,恰好我也能给”。 + +图片 + +图片 + +这辆车,不像是一个“老板”对“员工”的奖赏,更像是一个“姐妹”对另一个“姐妹”的贴心关怀。它不沾染功利,只是“你对我好,所以我也想对你好”的朴素回响。 + +正如网友感慨的那样,“用爱意剪出来的视频和照片,怎么会不好看呢?”同样,用爱意滋养出来的友情,又怎么会不让人羡慕? + +为什么白鹿和呵呵的友谊如此打动人心? + +或许是因为,在人际关系愈发脆薄、利益计算无处不在的当下,她们让我们看到了情感最本真、最牢固的样子。 + +图片 + +呵呵当初辞去稳定工作,是一次充满风险的托付;白鹿在崛起后,始终将呵呵带在身边、给予最好的信任与回报,是一场不曾辜负的奔赴。她们之间,有江湖义气般的担当。 + +最好的关系,不是谁拖着谁走,而是彼此扶持,共同升级。呵呵为了白鹿努力学习新技能,白鹿的成功,也给了呵呵更广阔的舞台。她们在风雨中,练就了彼此最适配的“盔甲”与“软肋”。 + +娱乐圈是最容易让人迷失的地方,多少情谊止步于“共苦”,却无法“同甘”。而她们,一个站到了聚光灯下,一个选择留在幕后,地位的变化没有带来隔阂,反而让那份陪伴更加厚重。她们守住了初心,也守住了彼此。 + +图片 + +回到开头那句话,“又是恨自己闺蜜不争气的一天”。 + +看完白鹿和呵呵的故事,我们或许会明白:真正的“争气”,未必是闺蜜要功成名就、光芒万丈。而是在彼此的人生里,无论高峰低谷,都能成为对方那个可以完全信赖、毫无保留去支持、也值得被对方同样对待的人:别怕,有我在。你很好,我会让你更好。 """ ) print("\n🎯 最终预测结果")