Python数据分析案例32——财经新闻爬虫和可视化分析

案例背景

很多同学的课程作业都是需要自己爬虫数据然后进行分析,这里提供一个财经新闻的爬虫案例供学习。本案例的全部数据和代码获取可以参考:财经新闻数据


数据来源

新浪财经的新闻网,说实话,他这个网站做成这样就是用来爬虫的...


代码实现

首先导入包

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
from wordcloud import WordCloud
import jieba ,re
import chardet 
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号

爬虫获取数据:

#定义爬取函数
def crawl_sina_finance_reports(pages=100):
    base_url = "https://stock.finance.sina.com.cn/stock/go.php/vReport_List/kind/lastest/index.phtml"
    reports = []
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    for page in range(1, pages + 1):
        url = f"{base_url}?p={page}"
        response = requests.get(url,headers=headers)#
        # 使用chardet检测编码
        detected_encoding = chardet.detect(response.content)['encoding']
        if detected_encoding:
            #print(detected_encoding)
            response.encoding = detected_encoding
        else:
            response.encoding = 'GB2312'  # 如果chardet无法检测到编码,则默认使用GB2312
        soup = BeautifulSoup(response.content)#, 'html.parser'

        # 找到所有报道的列表项
        report_items = soup.find_all('tr')[1:]  # 跳过表头
        for item in report_items:
            columns = item.find_all('td')
            if len(columns) >= 4:
                title = columns[1].text.strip()
                kind = columns[2].text.strip()
                date = columns[3].text.strip()
                organization = columns[4].text.strip()
                reports.append([title, kind, date, organization])

    return reports

# 爬取数据
reports_data = crawl_sina_finance_reports()

# 创建DataFrame
df_reports = pd.DataFrame(reports_data, columns=["标题",'报告类型', "发布日期", "机构"])
df_reports

爬了100面,大概2000多条,从1-4日到1-14号,各种类型和各种机构的报告。然后储存:

df_reports.to_csv('财经新闻.csv',index=False)  #储存

备份一下,然后开始分析:

df=df_reports.copy()

财经新闻不同种类数量对比

# Analysis 1: Value counts of report types and horizontal bar chart
report_type_counts = df['报告类型'].value_counts()
plt.figure(figsize=(8, 4),dpi=128)
sns.barplot(x=report_type_counts.index, y=report_type_counts.values, orient='v')
plt.title('Report Type Counts')
plt.xlabel('Report Type')
plt.ylabel('Count')
plt.xticks(rotation=45)
plt.show()

做行业研究的财经新闻最多,其次是公司和策略类。

每天发布新闻数量对比

# Analysis 2: Count news per day and plot a line chart
df['发布日期'] = pd.to_datetime(df['发布日期'])
news_counts_per_day = df['发布日期'].value_counts().sort_index()
plt.figure(figsize=(8, 4),dpi=128)
sns.lineplot(x=news_counts_per_day.index, y=news_counts_per_day.values, marker='o')
plt.title('News Counts Per Day')
plt.xlabel('Date')
plt.ylabel('Number of News')
plt.xticks(rotation=45)
# Adding data labels
for date, count in zip(news_counts_per_day.index, news_counts_per_day.values):
    plt.text(date, count, str(count), color='black', ha='center', va='bottom')

plt.show()

大体上曲曲折折,有高有低。

不同机构发文数量

def clean_institution_name(name):
    return re.sub(r'(研究所有限公司|股份有限公司)', '', name)

df['机构'] = df['机构'].apply(clean_institution_name)
institution_counts = df['机构'].value_counts().head(10)
plt.figure(figsize=(10, 6))
sns.barplot(x=institution_counts.values, y=institution_counts.index, orient='h')
plt.title('Top 10 Institutions')
plt.xlabel('Count')
plt.ylabel('Institution')
plt.show()

 

 可以看到国泰君安发的报告最多。

新闻标题词云图

计算新闻标题的高平词汇:

# Analysis 4: Word cloud of titles
all_titles = ' '.join(df['标题'])
# Word segmentation
seg_list = jieba.cut(all_titles, cut_all=False)
seg_text = ' '.join(seg_list)     
#对分词文本做高频词统计
word_counts = Counter(seg_text.split())
word_counts_updated=word_counts.most_common()
#过滤标点符号
non_chinese_pattern = re.compile(r'[^\u4e00-\u9fa5]')
# 过滤掉非中文字符的词汇
filtered_word_counts_regex = [item for item in word_counts_updated if not non_chinese_pattern.match(item[0])]
filtered_word_counts_regex[:5]

这五个词汇最常见

画出词云图:

# Generate word cloud
wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', 
                      max_words=80,        # Limits the number of words to 100
                      max_font_size=50)   #.generate(seg_text)    #文本可以直接生成,但是不好看
wordcloud = wordcloud.generate_from_frequencies(dict(filtered_word_counts_regex))
# Display the word cloud
plt.figure(figsize=(8, 5),dpi=256)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

 

长方形不好看,去找了一个❤图作为掩码:

from PIL import Image
# 加载本地图片
mask_image = Image.open("c2.png")  # 替换为您图片的路径
mask_array = np.array(mask_image)
# 创建 WordCloud 对象,传入 mask 参数
wordcloud = WordCloud(font_path='simhei.ttf', background_color='white', 
                      mask=mask_array, max_words=300, max_font_size=100)
# 使用 generate_from_frequencies 方法生成词云
wordcloud.generate_from_frequencies(dict(filtered_word_counts_regex))
# 显示词云图
plt.figure(figsize=(8, 8), dpi=256)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

 

 效果还不错。从图中可以看到,财经新闻基本都是什么行业,报告,策略,公司,投资等词汇。


然后进一步还可以爬取每个新闻里面的具体内容,然后使用snownlp做情感值计算打分,对不同时间,不同事件发生后新闻数量资料内容,关键词统计的对比之类的,做出更深度的分析,大家可以自己去进一步完善。

创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制代码可私信)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…

方案解决:5G基站节能及数字化管理

截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5G基站的能耗成为…

递归、搜索与回溯算法(专题六:记忆化搜索)

目录 1. 什么是记忆化搜索(例子:斐波那契数) 1.1 解法一:递归 1.2 解法二:记忆化搜索 1.2.1 记忆化搜索比递归多了什么? 1.2.2 提出一个问题:什么时候要使用记忆化搜索呢? 1.3 …

比吸收率(SAR)

本文旨在介绍比吸收率(Specific Absorption Rate)的基本知识。搬运自https://www.antenna-theory.com。英语够用的朋友可以直接移步。感谢网站创始人Peter Joseph Bevelacqua教授的无私奉献。 ------------------我是分隔线------------------- 比吸收…

视频号的视频怎么下载到手机,视频号下载提取到手机有几个步骤?

要下载视频号的视频并提取到手机,可以按照以下步骤操作,具体一起来看看。 电脑版视频号下载到手机 第一步:找到你心仪的视频号视频在电脑中你也可以通过搜索并找到自己需要的视频并分享给视频下载助手; 第二大步:视频…

C++ 设计模式之备忘录模式

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是备忘录模式 (第17种模式) 备忘录模式(Meme…

如何使用万能头 #include<bits/stdc++.h>

准备蓝桥杯的时候看到了很多头文件包含了这个头文件,后来查了一下 它是C中支持的一个几乎万能的头文件,几乎包含所有的可用到的C库函数。以后写代码就可以直接引用这一个头文件了,不需要在写一大堆vector、string、map、stack…… 我们该如何…

zookeeper弱密码漏洞修复

1.连接zookeeper 进入zookeeper安装目录 bin目录下 ./zkCli.sh -server IP:21812.查看节点 ls /3.查看节点权限 getAcl /zookeeper4.设置IP权限 setAcl / ip:127.0.0.1:cdrwa,ip:10.86.30.11:cdrwazookeeper的权限不具备继承性,父子节点的权限相互独立,因此需要为每个子…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 (三) 第三遍阅读(精读)3.1 Attention和Self-Attention的区别?3.2 Transformer是如何进行堆叠的?3.3 如何理解Positional Encoding?3.x 文章涉及…

浅析Redis①:命令处理核心源码分析(上)

写在前面 Redis作为我们日常工作中最常使用的缓存数据库,其重要性不言而喻,作为普调开发者,我们在日常开发中使用Redis,主要聚焦于Redis的基层数据结构的命令使用,很少会有人对Redis的内部实现机制进行了解&#xff0c…

龙哥的问题(积性函数,莫比乌斯反演)

题目路径: 221. 龙哥的问题 - AcWing题库 思路:

golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发…

《游戏-01_2D-开发》

首先利用安装好的Unity Hub创建一个unity 2D(URP渲染管线)项目 选择个人喜欢的操作格局(这里采用2 by 3) 在Project项目管理中将双栏改为单栏模式(个人喜好) 找到首选项(Preferences&#xff09…

带你学C语言-指针(4)

目录 ​编辑 ⚾0.前言 🏀1.回调函数 ⚽2.qsort 🏉2.1 qsort函数的模拟实现 🎾3.sizeof与strlen对比 🎾4.结束语 ⚾0.前言 言C之言,聊C之识,以C会友,共向远方。各位CSDN的各位你们好啊&…

docker 使用 vcs/2018 Verdi等 eda 软件

好不容易在ubuntu 安装好了eda软件,转眼就发现了自己的无知。 有博主几年前就搞定了docker上的EDA工具。而且更全,更简单。只恨自己太无知啊。 Synopsys EDA Tools docker image - EDA资源使用讨论 - EETOP 创芯网论坛 (原名:电子顶级开发网…

OB OCP工具

文章目录 OCP产品架构OCP核心功能集群管理-集群拓扑图告警管理 OCP OCP(OceanBase Cloud Platform)是企业级数据库管理平台OceanBase 云平台(OceanBase Cloud Platform,OCP)是以 OceanBase 为核心的企业级数据库管理平…

2024年【焊工(初级)】考试总结及焊工(初级)模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 焊工(初级)考试总结是安全生产模拟考试一点通总题库中生成的一套焊工(初级)模拟考试,安全生产模拟考试一点通上焊工(初级)作业手机同…

canvas绘制图形

目录 1、canvas绘制矩形 2、canvas绘制线 3、canvas绘制圆 4、canvas绘制多圈动画圆 HTML5<canvas>元素用于图形的绘制&#xff0c;Canvas API主要聚焦于2D图形。 1、canvas绘制矩形 canvas是一个二维网格&#xff0c;左上角坐标为(0,0)&#xff0c;横轴为x轴&…

Redis实战之-分布式锁

一、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行…

【jQuery入门】基础使用-入口函数、顶级对象$

文章目录 前言一、基础使用1.1 jQuery的下载1.2 简单的使用 二、顶级对象$总结 前言 jQuery是一款广泛应用于前端开发的JavaScript库&#xff0c;它简化了许多常见任务的操作&#xff0c;使得代码编写更加便捷。本文将介绍jQuery的基础使用&#xff0c;包括入口函数和顶级对象…