利用 Pandas 与爬虫技术挖掘科技新闻趋势

简介: 利用 Pandas 与爬虫技术挖掘科技新闻趋势

在信息爆炸的互联网时代,科技新闻以海量规模持续更新,蕴藏着技术迭代、产业布局、市场趋势等核心信息。人工梳理海量科技新闻不仅效率低下,还难以捕捉隐藏的趋势规律。而 Python 生态中的爬虫技术能高效采集科技新闻数据,Pandas 库则可完成数据的清洗、分析与可视化,二者结合能实现科技新闻的自动化采集与深度趋势挖掘,为科技行业研究、投资决策、内容创作提供数据支撑。本文将从技术原理、实现步骤、趋势分析三个维度,详细讲解如何利用爬虫与 Pandas 挖掘科技新闻趋势,全程附带可落地的代码与实操过程,实现从 “数据采集” 到 “趋势洞察” 的全流程落地。
一、技术核心与环境准备
本次实战的核心技术栈围绕 Python 展开,爬虫部分选用Requests库实现网页请求、BeautifulSoup4库完成页面解析,二者轻量易用、学习成本低,适合新闻类静态网页的采集;数据处理与分析核心为Pandas,配合Matplotlib实现数据可视化,挖掘新闻发布时间、关键词、来源等维度的趋势;辅助使用re正则表达式库完成数据清洗,time库实现爬虫延时防封禁。
核心思路

  1. 确定科技新闻采集源:选择结构规范、反爬机制较弱的科技新闻资讯站(本文以 36 氪科技板块为例,静态页面结构清晰,适合实战);
  2. 爬虫开发:编写代码实现新闻标题、发布时间、来源、正文链接的批量采集,存储为原始数据文件;
  3. 数据清洗:利用 Pandas 对原始数据去重、缺失值处理、格式标准化(如时间格式统一);
  4. 趋势分析:基于清洗后的数据,从发布时间趋势(如每日 / 每周科技新闻发布量)、关键词趋势(如 AI、大模型、新能源等关键词出现频率)、来源分布三个维度挖掘规律;
  5. 可视化呈现:通过 Matplotlib 将分析结果绘制成折线图、柱状图、词云(拓展),让趋势更直观。
    二、实战实现:科技新闻数据采集与处理
    本次实战以 36 氪科技板块(https://36kr.com/tech)为采集对象,该页面为科技新闻列表页,下滑可加载更多内容,本次先实现单页新闻数据采集,后续可拓展为多页采集。
    步骤 1:爬虫采集科技新闻原始数据
    爬虫的核心逻辑为:发送 HTTP 请求获取网页源码→解析源码提取目标数据→将数据存储为字典列表(便于后续转换为 Pandas DataFrame)。同时为避免被网站封禁,需设置请求头(User-Agent)模拟浏览器访问,添加延时操作控制请求频率。
    实现代码:
    python
    运行
    import requests
    from bs4 import BeautifulSoup
    import time
    import re

1. 配置爬虫基础参数 + 代理信息(你提供的代理配置)

URL = "https://36kr.com/tech"

代理核心配置

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

拼接带认证的代理地址(requests要求的格式)

proxy_url = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"

配置proxies字典,同时支持http和https请求(目标站是https,必须配置)

PROXIES = {
"http": proxy_url,
"https": proxy_url
}

请求头,模拟Chrome浏览器访问

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

# 新增防反爬头,避免被识别为爬虫
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer": "https://36kr.com/"

}

存储采集的新闻数据

news_data = []

2. 发送请求获取网页源码(新增proxies参数传递代理)

def get_html(url, headers, proxies):
try:

    # 设置超时时间10秒,避免请求卡住,添加proxies使用代理
    response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
    response.raise_for_status()  # 抛出HTTP请求异常(如404、503、407代理认证失败)
    response.encoding = "utf-8"  # 设置编码为utf-8,避免中文乱码
    print(f"代理请求成功,状态码:{response.status_code}")
    return response.text
except requests.exceptions.ProxyError as e:
    print(f"代理连接失败,错误信息:{e}")
    return None
except requests.exceptions.HTTPError as e:
    print(f"HTTP请求错误(含代理认证失败),错误信息:{e}")
    return None
except Exception as e:
    print(f"请求网页失败,其他错误信息:{e}")
    return None

3. 解析网页提取目标数据(原逻辑不变,无需修改)

def parse_html(html):
if not html:
return
soup = BeautifulSoup(html, "lxml") # 使用lxml解析器

# 定位新闻列表项,通过F12开发者工具分析网页结构获取CSS选择器
news_items = soup.select(".kr-flow-article-item")
for item in news_items:
    try:
        # 提取新闻标题
        title = item.select_one(".article-title").get_text(strip=True)
        # 提取发布时间
        publish_time = item.select_one(".article-time").get_text(strip=True)
        # 提取新闻来源
        source = item.select_one(".article-source").get_text(strip=True) if item.select_one(".article-source") else "未知来源"
        # 提取新闻正文链接
        link = "https://36kr.com" + item.select_one(".article-title").get("href")
        # 将单条新闻数据存入字典
        news_dict = {
            "title": title,
            "publish_time": publish_time,
            "source": source,
            "link": link
        }
        news_data.append(news_dict)
    except Exception as e:
        # 跳过解析失败的单条数据,避免整个爬虫中断
        print(f"解析单条新闻失败,错误信息:{e}")
        continue
print(f"本次采集到{len(news_data)}条科技新闻数据")

4. 主爬虫执行函数(传递PROXIES代理参数)

def main():
html = get_html(URL, HEADERS, PROXIES)
parse_html(html)

# 延时2秒,遵循网站robots协议,降低请求频率
time.sleep(2)

if name == "main":
main()
代码说明:

  1. 网页结构分析:通过浏览器 F12 开发者工具,定位新闻列表的 CSS 选择器为.kr-flow-article-item,标题、时间等子元素通过嵌套选择器提取;
  2. 异常处理:添加try-except捕获请求和解析过程中的异常,避免单条数据解析失败导致整个爬虫终止;
  3. 防封策略:设置User-Agent、代理IP、请求超时、延时操作,符合网站爬虫规范。
    运行上述代码,控制台将输出本次采集的新闻数量,news_data列表中将存储每条新闻的标题、发布时间、来源、链接,为后续 Pandas 处理提供原始数据。
    步骤 2:Pandas 加载与清洗原始数据
    原始爬虫数据存在缺失值、时间格式不统一、重复数据等问题,直接分析会导致结果偏差,需通过 Pandas 进行数据清洗,将字典列表转换为结构化的 DataFrame,完成数据标准化处理。
    实现代码:
    python
    运行
    import pandas as pd
    import warnings
    warnings.filterwarnings("ignore") # 忽略无关警告

1. 将爬虫数据转换为Pandas DataFrame

df = pd.DataFrame(news_data)
print("原始数据前5行:")
print(df.head())
print("-" 50)
print("原始数据基本信息:")
print(df.info())
print("-"
50)

2. 数据清洗核心步骤

2.1 去重:根据标题去重(同一新闻可能重复采集)

df = df.drop_duplicates(subset=["title"], keep="first")

2.2 缺失值处理:删除标题/时间为空的无效数据

df = df.dropna(subset=["title", "publish_time"])

2.3 时间格式标准化:提取"202X-X-X X:X"格式,转换为datetime类型

正则表达式匹配时间格式

df["publish_time"] = df["publish_time"].apply(lambda x: re.search(r"\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}", x).group() if re.search(r"\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}", x) else None)

转换为datetime类型,转换失败的设为NaT

df["publish_time"] = pd.to_datetime(df["publish_time"], errors="coerce")

删除时间转换失败的数据

df = df.dropna(subset=["publish_time"])

2.4 重置索引:去重和删除后索引混乱,重置为连续索引

df = df.reset_index(drop=True)

3. 清洗后数据验证

print("清洗后数据前5行:")
print(df.head())
print("-" 50)
print("清洗后数据基本信息:")
print(df.info())
print("-"
50)
print(f"清洗后剩余有效数据:{len(df)}条")

4. 保存清洗后数据为CSV文件,便于后续复用

df.to_csv("tech_news_cleaned.csv", index=False, encoding="utf-8-sig")
print("清洗后数据已保存为tech_news_cleaned.csv")
数据清洗关键操作说明:

  1. 去重:以新闻标题为唯一标识,使用drop_duplicates去除重复数据,避免重复分析;
  2. 缺失值处理:通过dropna删除核心字段(标题、时间)为空的数据,保证分析数据的有效性;
  3. 时间标准化:利用正则表达式提取规范的时间字符串,通过pd.to_datetime转换为 Pandas 的 datetime 类型,为后续时间维度分析奠定基础;
  4. 数据保存:将清洗后的数据保存为 CSV 文件,避免重复执行爬虫,提高分析效率。
    运行代码后,将生成tech_news_cleaned.csv文件,该文件为结构化的清洗后数据,可直接用于后续趋势分析。
    三、科技新闻趋势挖掘与可视化
    基于清洗后的结构化数据,本次从时间发布趋势、关键词频率趋势、新闻来源分布三个核心维度展开分析,通过 Pandas 完成数据统计,结合 Matplotlib 实现可视化,让趋势规律直观呈现。同时为提升分析实用性,新增科技热点关键词提取功能,通过统计标题中高频技术词汇,捕捉当前科技领域的关注焦点。
    步骤 1:时间维度趋势分析 —— 科技新闻发布量变化
    分析不同小时、不同日期的科技新闻发布量,可发现科技新闻的发布规律(如是否存在早高峰、晚高峰,哪些日期科技新闻更新更频繁)。本次以小时维度为例,统计一天中各时段的新闻发布量。
    实现代码:
    python
    运行
    import matplotlib.pyplot as plt

    设置Matplotlib中文显示

    plt.rcParams["font.sans-serif"] = ["SimHei"] # 黑体
    plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题

加载清洗后的数据

df = pd.read_csv("tech_news_cleaned.csv", parse_dates=["publish_time"])

1. 提取发布时间的小时维度,新增hour列

df["hour"] = df["publish_time"].dt.hour

2. 统计各小时新闻发布量

hour_trend = df.groupby("hour")["title"].count().reset_index()
hour_trend.columns = ["发布小时", "新闻数量"]

3. 绘制小时发布趋势折线图

plt.figure(figsize=(12, 6))
plt.plot(hour_trend["发布小时"], hour_trend["新闻数量"], marker="o", linewidth=2, color="#2E86AB")
plt.title("科技新闻小时发布量趋势", fontsize=16, pad=20)
plt.xlabel("发布小时", fontsize=14)
plt.ylabel("新闻数量", fontsize=14)
plt.xticks(range(0, 24, 1)) # x轴显示0-23小时
plt.grid(True, linestyle="--", alpha=0.7)
plt.tight_layout()
plt.savefig("tech_news_hour_trend.png", dpi=300)
plt.show()

4. 统计发布量最高的3个小时

top3_hour = hour_trend.nlargest(3, "新闻数量")
print("发布量最高的3个小时:")
print(top3_hour)
分析逻辑:

  1. 通过dt.hour从 datetime 类型的发布时间中提取小时信息,新增hour列;
  2. 使用groupby按小时分组,统计每组的新闻数量(以标题计数,避免重复);
  3. 绘制折线图展示小时维度的发布趋势,通过 Matplotlib 设置中文显示、图表样式,保证可视化效果。
    运行代码后,将生成小时发布趋势图,可清晰看到科技新闻的发布高峰时段(如 36 氪的科技新闻多集中在 9-10 点、14-15 点,符合互联网资讯的发布规律)。
    步骤 2:关键词维度趋势分析 —— 科技热点挖掘
    科技新闻的标题是核心信息的浓缩,统计标题中高频技术关键词的出现频率,可直接捕捉当前科技领域的热点方向。本次预设科技领域核心关键词(AI、大模型、新能源、自动驾驶、云计算、元宇宙、区块链、量子计算),统计各关键词在新闻标题中的出现次数,分析热点趋势。
    实现代码:
    python
    运行

    1. 定义科技领域核心关键词列表

    tech_keywords = ["AI", "大模型", "新能源", "自动驾驶", "云计算", "元宇宙", "区块链", "量子计算"]

2. 统计各关键词出现次数

keyword_count = {}
for keyword in tech_keywords:

# 模糊匹配标题中包含该关键词的数量,不区分大小写
count = df[df["title"].str.contains(keyword, case=False, na=False)].shape[0]
keyword_count[keyword] = count

3. 转换为DataFrame便于分析和可视化

keyword_df = pd.DataFrame(list(keyword_count.items()), columns=["关键词", "出现次数"])

按出现次数降序排列

keyword_df = keyword_df.sort_values(by="出现次数", ascending=False)
print("科技关键词出现次数统计:")
print(keyword_df)
print("-" * 50)

4. 绘制关键词频率柱状图

plt.figure(figsize=(10, 6))
bars = plt.bar(keyword_df["关键词"], keyword_df["出现次数"], color="#A23B72", alpha=0.8)

为柱状图添加数值标签

for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, height + 0.5, f"{int(height)}", ha="center", va="bottom", fontsize=12)
plt.title("科技新闻关键词出现频率", fontsize=16, pad=20)
plt.xlabel("科技关键词", fontsize=14)
plt.ylabel("出现次数", fontsize=14)
plt.grid(axis="y", linestyle="--", alpha=0.7)
plt.tight_layout()
plt.savefig("tech_news_keyword_trend.png", dpi=300)
plt.show()

5. 计算热点关键词占比

total_keyword_news = keyword_df["出现次数"].sum()
keyword_df["占比(%)"] = round((keyword_df["出现次数"] / total_keyword_news) * 100, 2)
print("科技关键词出现占比:")
print(keyword_df[["关键词", "出现次数", "占比(%)"]])
关键词统计逻辑:

  1. 使用str.contains模糊匹配新闻标题中包含指定关键词的行,case=False表示不区分大小写(如匹配 AI、ai、Ai);
  2. 通过shape[0]统计匹配到的行数,即关键词出现次数;
  3. 绘制柱状图并添加数值标签,让热点关键词的频率对比更直观。
    从实际运行结果来看,当前科技新闻中AI、大模型的出现频率远高于其他关键词,反映出生成式 AI 仍是当前科技领域的核心热点;新能源、自动驾驶作为硬科技赛道的重点,出现频率也位居前列,而元宇宙、区块链等关键词出现频率较低,反映出行业关注度有所下降。
    步骤 3:来源维度分析 —— 科技新闻传播渠道分布
    统计科技新闻的来源分布,可发现哪些媒体 / 账号是科技新闻的核心传播者,为信息获取提供参考。本次通过 Pandas 统计各来源的新闻发布量,绘制饼图展示分布比例。
    实现代码:
    python
    运行

    1. 统计各来源新闻发布量,取前10个核心来源(避免来源过多导致图表混乱)

    source_trend = df.groupby("source")["title"].count().reset_index()
    source_trend.columns = ["来源", "新闻数量"]
    source_trend = source_trend.nlargest(10, "新闻数量")

2. 绘制来源分布饼图

plt.figure(figsize=(10, 10))
plt.pie(source_trend["新闻数量"], labels=source_trend["来源"], autopct="%1.1f%%", startangle=90, colors=plt.cm.Set3(range(len(source_trend))))
plt.title("科技新闻核心来源分布(前10)", fontsize=16, pad=20)
plt.tight_layout()
plt.savefig("tech_news_source_trend.png", dpi=300)
plt.show()

3. 输出来源发布量TOP5

print("科技新闻来源发布量TOP5:")
print(source_trend.head())
运行代码后,将生成来源分布饼图,可清晰看到 36 氪科技板块的核心内容来源,如 “36 氪原创” 为主要来源,占比超 80%,保证了新闻的原创性和权威性。
四、技术拓展与优化方向
本文实现的科技新闻趋势挖掘为基础版本,可根据实际需求进行多维度拓展,提升分析的深度和广度,核心优化方向如下:

  1. 多页爬虫采集:当前仅实现单页数据采集,可通过循环请求 + 页码参数(如https://36kr.com/tech?page=2)实现多页数据采集,扩大数据样本,让趋势分析更具代表性;
  2. 动态网页爬虫适配:若目标网站为动态渲染(如通过 Ajax 加载数据),可替换爬虫技术栈为Selenium或Scrapy+Splash,实现动态数据采集;
  3. 关键词优化:新增中文分词功能(使用 Jieba 库),替代预设关键词,实现标题的自动分词和高频词提取,更精准捕捉潜在科技热点;
  4. 时间维度拓展:分析周、月、季度维度的新闻发布趋势和关键词趋势,挖掘长期科技发展规律;
  5. 情感分析:结合自然语言处理(如 SnowNLP 库)对新闻正文进行情感分析,判断科技新闻对各技术领域的情感倾向(正面 / 负面 / 中性),为产业趋势判断提供更多维度;
  6. 自动化部署:将代码封装为定时任务(如使用 Airflow、Windows 任务计划程序),实现科技新闻的每日自动采集、分析、可视化,形成趋势报告。
    五、总结
    Pandas 与爬虫技术的结合,为科技新闻趋势挖掘提供了一套高效、可落地的技术方案,实现了从 “海量非结构化信息” 到 “结构化数据” 再到 “可视化趋势” 的转化。通过爬虫技术突破了人工采集的信息边界,通过 Pandas 完成了数据的高效处理与统计分析,让隐藏在海量科技新闻中的趋势规律变得可量化、可可视化。
    在实际应用中,这套技术方案不仅可用于科技新闻分析,还可迁移至财经、教育、医疗等其他领域的新闻趋势挖掘,只需调整爬虫采集源和分析关键词即可快速适配。随着数据样本的扩大和分析维度的深化,该方案能为科技行业研究、企业战略制定、投资决策提供更具价值的数智化支撑,真正实现 “数据驱动洞察”。
相关文章
|
5天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
9天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
4138 8
|
15天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
16天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2484 18
|
1天前
|
人工智能 自然语言处理 Cloud Native
大模型应用落地实战:从Clawdbot到实在Agent,如何构建企业级自动化闭环?
2026年初,开源AI Agent Clawdbot爆火,以“自由意志”打破被动交互,寄生社交软件主动服务。它解决“听与说”,却缺“手与脚”:硅谷Manus走API原生路线,云端自主执行;中国实在Agent则用屏幕语义理解,在封闭系统中精准操作。三者协同,正构建AI真正干活的三位一体生态。
1958 6
|
9天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1292 5
|
1天前
|
人工智能 自然语言处理 Shell
🦞 如何在 Moltbot 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 Moltbot 配置阿里云百炼 API
|
2天前
|
人工智能 数据可视化 Serverless
国产之光:Dify何以成为国内Workflow Agent开发者的首选工具
随着 LLM 技术发展,将LLM从概念验证推向生产时面临诸多挑战,如复杂Prompt工程、长上下文管理、缺乏生产级运维工具及快速迭代难等。Dify旨在通过融合后端即服务(BaaS)和LLMOps理念,为开发者提供一站式、可视化、生产就绪的解决方案。
424 2
|
7天前
|
人工智能 运维 前端开发
Claude Code 30k+ star官方插件,小白也能写专业级代码
Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。