当前位置: 首页 > news >正文

时序数据分析:Python爬取新浪财经频道新闻并绘制趋势图

引言:数据背后的商业脉搏

在信息爆炸的时代,财经新闻不仅是市场动态的反映,其本身也是一种极具价值的时间序列数据。通过对海量财经新闻进行爬取、分析和可视化,我们可以从宏观视角洞察市场情绪的波动、热点议题的变迁以及潜在的投资风向。传统的定性阅读难以捕捉这种宏观趋势,而结合Python强大的爬虫与数据分析能力,我们便能将文本信息转化为直观的“数据脉搏图”。

本文将手把手带您实现一个完整的项目:从爬取新浪财经频道新闻开始,到清洗和提取关键信息,最后将新闻数量与时间的关系绘制成趋势图,并进行初步分析。我们将使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Requests</font><font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">BeautifulSoup</font><font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Pandas</font><font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Matplotlib</font>等核心库,完整呈现一个轻量级的数据分析流水线。

一、 技术栈与整体思路

核心技术栈:

  • 网络爬虫: <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Requests</font> (发送HTTP请求) + <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">BeautifulSoup4</font> (解析HTML)
  • 数据处理: <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Pandas</font> (数据结构化与时间序列处理)
  • 数据可视化: <font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Matplotlib</font> (绘制趋势图)

整体实现思路:

  1. 目标确定: 爬取新浪财经频道某个特定栏目(如“国内财经”)的新闻列表,至少抓取多页内容以获得一定时间跨度的数据。
  2. 数据爬取: 分析网页结构,编写爬虫代码,循环抓取多页新闻的标题、链接和发布时间。
  3. 数据清洗与结构化: 将爬取的原始数据转换为Pandas的DataFrame,并将发布时间字符串转换为标准的<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">datetime</font>类型,这是时序分析的基础。
  4. 趋势分析: 按日期对新闻数量进行分组聚合,计算每天的新闻发文量。
  5. 可视化呈现: 使用Matplotlib将“日期-新闻数量”数据绘制成折线图或柱状图,直观展示趋势。
二、 实战代码:分步实现

步骤一:环境准备与库导入

首先,确保已安装必要的库

随后,在Python脚本中导入它们

import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import time
import re# 设置中文字体,解决Matplotlib显示中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 例如使用黑体
plt.rcParams['axes.unicode_minus'] = False   # 解决负号显示问题

步骤二:爬取新浪财经新闻数据

我们以新浪财经的“国内财经”栏目为例。我们需要分析其分页规律和页面结构。

经过分析,一个典型的分页URL模式为:<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">https://finance.sina.com.cn/roll/index.d.html?cid=56957&page=1</font>,其中<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">page</font>参数控制页码。

以下是爬虫的核心代码:

import requests
from bs4 import BeautifulSoup
import timedef crawl_sina_finance_news(page_num=10):"""爬取新浪财经国内频道多页新闻:param page_num: 要爬取的页数:return: 包含新闻数据的列表"""# 代理配置proxyHost = "www.16yun.cn"proxyPort = "5445"proxyUser = "16QMSOML"proxyPass = "280651"base_url = "https://finance.sina.com.cn/roll/index.d.html?cid=56957&page={}"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}all_news = []# 方式1:使用HTTP Basic Auth的代理格式proxies = {'http': f'http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}','https': f'https://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}'}# 方式2:分开设置认证信息(如果方式1不适用,可以使用这种方式)# proxies = {#     'http': f'http://{proxyHost}:{proxyPort}',#     'https': f'https://{proxyHost}:{proxyPort}'# }for page in range(1, page_num + 1):url = base_url.format(page)print(f"正在爬取第 {page} 页: {url}")try:# 使用代理发送请求response = requests.get(url, headers=headers, proxies=proxies,timeout=30  # 添加超时设置)# 检查请求是否成功if response.status_code != 200:print(f"请求失败,状态码: {response.status_code}")continueresponse.encoding = 'utf-8'  # 新浪财经使用utf-8编码soup = BeautifulSoup(response.text, 'html.parser')# 找到新闻列表的容器,根据实际HTML结构调整news_list = soup.find_all('li', class_=False)  # 示例选择器,可能需要调整# 更精确的选择器可能是:soup.select('.list_009 ul li') 等,请以实际审查为准。page_news_count = 0for item in news_list:link_tag = item.find('a')time_tag = item.find('span')if link_tag and time_tag:title = link_tag.get_text().strip()link = link_tag.get('href')publish_time_str = time_tag.get_text().strip()# 将数据存入字典news_data = {'title': title,'link': link,'publish_time': publish_time_str}all_news.append(news_data)page_news_count += 1print(f"第 {page} 页爬取到 {page_news_count} 条新闻")# 礼貌爬取,添加延迟time.sleep(1)except requests.exceptions.ProxyError as e:print(f"代理连接错误 (第 {page} 页): {e}")continueexcept requests.exceptions.ConnectTimeout as e:print(f"连接超时 (第 {page} 页): {e}")continueexcept requests.exceptions.RequestException as e:print(f"网络请求错误 (第 {page} 页): {e}")continueexcept Exception as e:print(f"爬取第 {page} 页时发生未知错误: {e}")continuereturn all_news# 执行爬取,抓取5页作为示例
if __name__ == "__main__":try:news_data_list = crawl_sina_finance_news(page_num=5)print(f"共爬取到 {len(news_data_list)} 条新闻。")# 打印前几条新闻作为示例if news_data_list:print("\n前5条新闻示例:")for i, news in enumerate(news_data_list[:5]):print(f"{i+1}. 标题: {news['title']}")print(f"   时间: {news['publish_time']}")print(f"   链接: {news['link']}\n")except KeyboardInterrupt:print("\n用户中断爬取")except Exception as e:print(f"程序执行出错: {e}")

注意: 网站的HTML结构可能会发生变化,上述代码中的<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">news_list = soup.find_all('li', class_=False)</font>是一个示例选择器。在实际操作中,您需要使用浏览器的“开发者工具”来检查正确的HTML标签和CSS选择器。

步骤三:数据清洗与时间序列转换

爬取到的原始数据中的时间是字符串格式,我们需要将其转换为Pandas的<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">datetime</font>对象。

# 将数据转换为DataFrame
df = pd.DataFrame(news_data_list)# 检查数据
print("原始数据前5行:")
print(df.head())# 数据清洗:处理空值
df.dropna(subset=['publish_time'], inplace=True)# 时间字符串处理
def parse_time(time_str):"""解析不同格式的时间字符串"""try:# 匹配 "MM月DD日 HH:MM" 的格式match = re.search(r'(\d{1,2})月(\d{1,2})日 (\d{2}:\d{2})', time_str)if match:month, day, time_part = match.groups()# 假设是当前年,如果需要历史数据,需要从其他信息推断current_year = datetime.now().yearnew_time_str = f"{current_year}-{int(month):02d}-{int(day):02d} {time_part}"return pd.to_datetime(new_time_str)else:# 尝试其他格式或直接转换return pd.to_datetime(time_str, errors='coerce') # 无法解析则返回NaTexcept Exception as e:return pd.NaTdf['publish_time_parsed'] = df['publish_time'].apply(parse_time)# 再次清洗,去除无法解析的时间
df = df.dropna(subset=['publish_time_parsed'])# 按解析后的时间排序
df = df.sort_values('publish_time_parsed')print("\n清洗并解析时间后的数据:")
print(df[['title', 'publish_time', 'publish_time_parsed']].head())

步骤四:按日期聚合新闻数量

这是时序分析的核心,我们使用Pandas的<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">resample</font>方法。

# 将解析后的时间设为索引
df_time_indexed = df.set_index('publish_time_parsed')# 按天('D')进行聚合,计算每天的新闻数量
daily_news_count = df_time_indexed.resample('D').size()print("每日新闻数量:")
print(daily_news_count.head(10))

步骤五:绘制趋势图

最后,我们使用Matplotlib将数据可视化。

# 创建图表
plt.figure(figsize=(14, 7))# 绘制折线图
plt.plot(daily_news_count.index, daily_news_count.values, marker='o', linestyle='-', linewidth=2, markersize=4)# 设置图表标题和标签
plt.title('新浪财经国内频道每日新闻发文量趋势', fontsize=16, fontweight='bold')
plt.xlabel('日期', fontsize=12)
plt.ylabel('新闻数量', fontsize=12)# 美化图表
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(rotation=45)  # 旋转x轴标签,避免重叠
plt.tight_layout()  # 自动调整布局# 显示图表
plt.show()# 也可以选择绘制柱状图,更能体现离散数据的数量
plt.figure(figsize=(14, 7))
plt.bar(daily_news_count.index, daily_news_count.values, color='skyblue', edgecolor='gray', alpha=0.8)
plt.title('新浪财经国内频道每日新闻发文量趋势(柱状图)', fontsize=16, fontweight='bold')
plt.xlabel('日期', fontsize=12)
plt.ylabel('新闻数量', fontsize=12)
plt.xticks(rotation=45)
plt.grid(True, linestyle='--', alpha=0.7, axis='y') # 只显示y轴网格
plt.tight_layout()
plt.show()
三、 结果分析与商业洞察

运行上述代码后,您将得到一张清晰的新浪财经新闻发文量时序图。通过对这张图的解读,我们可以获得诸多洞察:

  • 识别峰值事件: 图中突然出现的尖峰通常对应着重大财经事件的发生,如央行降准降息、重要经济数据发布(GDP、CPI)、重大政策出台等。可以结合新闻标题,回溯当天的具体新闻内容,验证这一关联。
  • 观察周期性规律: 您可能会发现工作日新闻发布密集,周末数量减少的周期性 pattern。这对于理解媒体的运营节奏和用户阅读习惯有所帮助。
  • 评估媒体活跃度: 该趋势图本身也是新浪财经频道内容产出活跃度的一个量化指标。
  • 情绪分析的基础: 本文仅做了数量分析。在此基础上,可以进一步对爬取的新闻标题进行情感分析(使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">snownlp</font><font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">jieba</font>+情感词典),计算出每日新闻的平均情感倾向,从而绘制出“市场情绪指数”曲线,其价值将远超单纯的数量分析。
http://www.dtcms.com/a/594187.html

相关文章:

  • 福州网站建设流程深圳公共资源交易中心
  • 东莞网站公司哪家好当下 如何做网站赚钱
  • 5.会话列表测试用例
  • 咨询公司网站设计电商网站商品中心设计方案
  • 电子商务网站版面布局天津北京网站建设公司哪家好
  • Java基础——集合进阶8
  • README查看会议信息
  • 云校网站建设网站优化排名易下拉系统
  • 基础算法精讲 09|递归|操作型|计算型
  • OpenCSG 2025年10月月报:战略合作、学术突破、H200上新与社会责任
  • Lua基本语法
  • 关于网站建设的请示范文东莞网站优化一般多少钱
  • CI/CD 全流程指南:从概念到落地的持续交付实践
  • 软件生产的“高速公路网”:深入浅出理解CI/CD的核心流程
  • 网站列表设计东城企业网站建设
  • 医学类数据集目标检测分割分类数据集汇总介绍
  • 2017网站建设傻瓜式网站开发
  • 开发环境搭建之JDK11+maven3.9.8+tomcat9安装
  • phpcmsv9手机网站模板wordpress file upload
  • Socket编程核心API详解
  • 网站关键词排名怎么提升app开发外包要多少钱
  • 使用 Node.js 开发 Telegram Bot 完整指南
  • 招聘网站代理做网站提供服务器吗
  • AI宠物的情感交互设计与市场反响
  • 【C/C++】C++11 类的 默认构造函数 “= default” 用法
  • 自己建的网站可以用笔记本做服务器吗推广网站建设产品介绍
  • 嵌入式C语言中结构体使用方法与技巧
  • 深度学习(1)—— 基本概念
  • 【Java EE进阶 --- SpringBoot】Spring 核心 --- AOP
  • 4.95基于8086流水灯霓虹彩灯控制器,8086彩灯控制器proteus8.9仿真文件+源码功能四个开关对应四种模式。