Python爬取东方财富股吧帖子信息并进行情感分析

股吧是东方财富网旗下股票主题社区,用户可进行实时行情评论和个股交流。本文将对股吧中的上证指数吧的帖子信息进行提取,并对帖子标题进行情感分析。

网址:

https://guba.eastmoney.com/list,zssh000001_1.html

image

目录

一、Python网络爬虫——爬取东方财富网帖子信息

1、观察网页

2、请求数据

3、解析数据

4、存储数据

二、Python情感分析——对爬取的帖子标题进行情感分析

1、snownlp库的简介

2、snownlp库的安装

3、snownlp库的使用

4、snownlp运用实例

一、Python网络爬虫——爬取东方财富网帖子信息(以1-10页为例)

1、观察网页

1.1 观察单页

(1)谷歌浏览器右键“检查”,点击“Network”,刷新页面。

(2)点击最上面的链接

(3)点击“Preview”或者“Response”,可以发现我们需要的数据在这里。说明这是一个静态网页。

image

1.2 观察翻页规律

本文的目标是爬取上证指数吧的帖子信息,上证指数的名称代码为zssh000001。

首页:
https://guba.eastmoney.com/list,zssh000001_1.html
第二页:
https://guba.eastmoney.com/list,zssh000001_2.html
第{i}页:
https://guba.eastmoney.com/list,zssh000001_{i}.html

通过观察,可以看出股吧链接后缀主要由三部分组成:list、名称代码、页数。

因此,我们可以构建for循环,爬取多页的数据。

2、请求数据

查看Headers,发现为get请求,可通过requests库请求数据。

image

代码如下:

#导入相关库
import requests
from bs4 import BeautifulSoup
import pandas as pd

#请求数据,定义函数
def getHTMLText(url):
    r=requests.get(url)
    r.encoding=r.apparent_encoding
    text=r.text
    return text

3、解析数据

我们需要获取的是”阅读数”、“评论数”、“标题”、“作者”、“最后更新”这五个信息,这五个信息分别位于<span></span>行标签内,对应的属性分别是"l1 a1"、"l2 a2"、"l3 a3"、"l4 a4"、"l5 a5"。我们采用BeautifulSoup库解析数据并进行信息提取。

image

代码如下:

#解析单个网页,并提取数据字段
def getOnePageInfo(url): 
    one_page_data=[]
    text=getHTMLText(url)
    soup=BeautifulSoup(text,'html.parser')
    post_list=soup.find_all('div',class_="articleh normal_post")#找到所有的帖子所在标签
    for post in post_list:
        read_counts=post.find('span',class_='l1 a1').text #获取帖子阅读数
        comment_counts=post.find('span',class_='l2 a2').text #获取帖子评论数
        title=post.find('span',class_='l3 a3').text #获取帖子标题
        author_id=post.find('span',class_='l4 a4').text #获取作者id       
        time=post.find('span',class_='l5 a5').text #获取更新时间
        data=[read_counts,comment_counts,title,author_id,time]
        one_page_data.append(data)
    return one_page_data

4、存储数据

我们可通过pandas的to_csv函数将数据写入到csv中。

代码如下:

#循环获取多页信息(以1-10页为例)
all_data=[]
for i in range(1,11):
    url=f'https://guba.eastmoney.com/list,zssh000001_{i}.html'
    one_page_data=getOnePageInfo(url)
    all_data.extend(one_page_data) #extend可以添加列表

#将数据存储至csv文件中
all_data=pd.DataFrame(all_data,columns=['阅读数','评论数','标题','作者','最后更新'])
all_data.to_csv(r'D:\代码\1 bs\000001帖子.csv')

存储结果如下:

image

二、Python情感分析——对爬取的帖子标题进行情感分析

1、snownlp库的简介

很多场景下,我们都需要用到情感分析技术。比如,做金融产品分析,需要根据投资者评论数据来分析投资者情绪;电商交易需要根据买家的评论数据来分析商品的预售率等。那么到底什么是文本情感分析,我们又该如何做文本情感分析呢?

情感分析是根据情感倾向来进行的,而情感倾向最常见的就是喜欢、不喜欢、讨厌等。

目前情感倾向分析的方法主要分为两类:一类是基于情感词典的方法,一类是基于机器学习的方法。这两者主要的区别是,前者需要用到标注好的情感词典;后者则需要大量人工标注的语料作为训练集,通过提取文本特征,构建分类器来实现情感的分类。

下面先简单介绍基于snownlp的评论数据情感分析方法。

snownlp是一个基于Python的情感分析工具库,可以进行中文分词、词性标注、情感分析、文本分类、文本关键词提取等。snownlp的情感值取值范围为0到1之间,值越大,说明情感倾向越积极。但snownlp库有一个缺陷,便是其模型的训练语料是商品购物评论语料,用来做金融领域的情感分类效果一般,但目前还并没有关于金融领域的中文自然语言处理的开源库、语料库。所以这里我们暂时使用snownlp库对股吧帖子进行情感分析。

2、snownlp库的安装

由于Anaconda没有集成snownlp分词库,因此需要安装。安装方式:

打开Anaconda Prompt,选择开始菜单-Anaconda3-Anaconda Prompt。

在命令行中输入:

pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple/

这里使用清华镜像下载,因为访问官方的pypi不稳定,速度很慢。

3、snownlp库的使用

(1)根据文本创建一个 SnowNLP 对象

(2)使用相关的方法(如中文分词、词性标注、情感分析、文本分类、文本关键词提取)进行操作

4、snownlp运用实例

我们在“一、Python网络爬虫——爬取东方财富网帖子信息(以1-10页为例)”获取的帖子信息的基础上,对帖子标题内容进行情感分析,代码如下:

#使用SnowNLP计算对每个帖子标题的文字评估情绪得分
from snownlp import SnowNLP
def senti(text):
    s=SnowNLP(text)
    return s.sentiments
all_data['情绪']=all_data['标题'].apply(senti)
all_data.to_csv(r'D:\代码\1 bs\000001帖子+情感.csv')

结果如下:

image

全套代码

#导入相关库
import requests
from bs4 import BeautifulSoup
import pandas as pd
from snownlp import SnowNLP

#请求数据,定义函数
def getHTMLText(url):
    r=requests.get(url)
    r.encoding=r.apparent_encoding
    text=r.text
    return text
    
#解析单个网页,并提取数据字段
def getOnePageInfo(url): 
    one_page_data=[]
    text=getHTMLText(url)
    soup=BeautifulSoup(text,'html.parser')
    post_list=soup.find_all('div',class_="articleh normal_post")#找到所有的帖子所在标签
    for post in post_list:
        read_counts=post.find('span',class_='l1 a1').text #获取帖子阅读数
        comment_counts=post.find('span',class_='l2 a2').text #获取帖子评论数
        title=post.find('span',class_='l3 a3').text #获取帖子标题
        author_id=post.find('span',class_='l4 a4').text #获取作者id       
        time=post.find('span',class_='l5 a5').text #获取更新时间
        data=[read_counts,comment_counts,title,author_id,time]
        one_page_data.append(data)
    return one_page_data

#循环获取多页信息(以1-10页为例)
all_data=[]
for i in range(1,11):
    url=f'https://guba.eastmoney.com/list,zssh000001_{i}.html'
    one_page_data=getOnePageInfo(url)
    all_data.extend(one_page_data) #extend可以添加列表

#将数据存储至csv文件中
all_data=pd.DataFrame(all_data,columns=['阅读数','评论数','标题','作者','最后更新'])
all_data.to_csv(r'D:\代码\1 bs\000001帖子.csv')

#使用SnowNLP计算对每个帖子标题的文字评估情绪得分
def senti(text):
    s=SnowNLP(text)
    return s.sentiments
all_data['情绪']=all_data['标题'].apply(senti)
all_data.to_csv(r'D:\代码\1 bs\000001帖子+情感.csv')

Attention:截至发文前,上证指数吧共有8万多页,我们的案例是获取1-10页的,如果是8万多页呢?把10改成8万?

当爬虫频率过高时,会触发东方财富网的反爬机制,如何解决呢?

请听下回分解。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容