股吧是东方财富网旗下股票主题社区,用户可进行实时行情评论和个股交流。本文将对股吧中的上证指数吧的帖子信息进行提取,并对帖子标题进行情感分析。
网址:
https://guba.eastmoney.com/list,zssh000001_1.html
目录
一、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”,可以发现我们需要的数据在这里。说明这是一个静态网页。
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库请求数据。
代码如下:
#导入相关库
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库解析数据并进行信息提取。
代码如下:
#解析单个网页,并提取数据字段
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')
存储结果如下:
二、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')
结果如下:
全套代码
#导入相关库
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万?
当爬虫频率过高时,会触发东方财富网的反爬机制,如何解决呢?
请听下回分解。