feat: 增加新华网政务分类爬虫 不集成到爬虫框架

This commit is contained in:
shenjianZ 2026-01-15 22:04:11 +08:00
parent 4684216c85
commit 5eb92268ec
3 changed files with 248 additions and 33 deletions

View File

@ -47,3 +47,4 @@ Thumbs.db
# Project specific # Project specific
config/local.yaml config/local.yaml
*.local.yaml *.local.yaml
example

177
crawler-module/xinhuanet.py Normal file
View File

@ -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()

View File

@ -117,66 +117,103 @@ def print_probabilities_table(probabilities: Dict[str, float]):
if __name__ == '__main__': if __name__ == '__main__':
# 测试 # 测试
result = predict_single( result = predict_single(
title="BBA在华销量跌回七八年前", title="白鹿给助理全款提车,又把我羡慕哭了",
content=""" 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万辆
  上述数据显示2025BBA中国市场销量水平回到了七八年前
  根据各家官网披露的数据宝马奔驰奥迪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款BMWMINI和BMW摩托车新产品其中国产长轴距版新世代BMW iX3将于2026年上半年全球首发并在下半年上市该车将搭载宝马集团首创的全景iDriveBMW新世代电驱系统BMW驾控超级大脑等技术 娱乐圈是个名利场也是个加速器凭借努力和机遇白鹿的事业逐渐走上正轨人气攀升一步步跻身当红小花行列地位变了环境变了可身边的人却没变呵呵依然在那里身份却早已超越了普通的工作伙伴
  按照梅赛德斯-奔驰的计划其2026年将向中国市场引入超15款全新和改款产品覆盖新生代豪华核心豪华和高端豪华细分市场以及多种驱动方式如旗下三大全新纯电架构平台MB.EAAMG.EAVAN.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🎯 最终预测结果") print("\n🎯 最终预测结果")