本篇主要是通过对豆瓣图书《平凡的世界》短评进行抓取并进行分析,并用snowNLP对其进行情感分析。

用到的模块有snowNLP,是一个python库,用来进行情感分析。

1.抓取数据

我们把抓取到的数据存储到sqlite,先建表,结构如下:

CREATE TABLE comment(
id integer PRIMARY KEY autoincrement NOT NULL,
commentator VARCHAR(50) NOT NULL,
star INTEGER NOT NULL,
time VARCHAR(50) NOT NULL,
content TEXT NOT NULL
);

然后写python代码进行抓取,如下:

import sys
from os import path
import time
import urllib3
import requests
import numpy as np
import sqlite3
from bs4 import BeautifulSoup
from urllib import parse
from snownlp import SnowNLP
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud
from PIL import Image headers=[{'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},\
{'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'},\
{'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'}] def get_comment():
page_num = 0;
total_num = 0;
while(1):
page_num +=1
url = "https://book.douban.com/subject/1200840/comments/hot?p="+str(page_num)
print(url)
http = urllib3.PoolManager()
time.sleep(np.random.rand()*5)
try:
r = http.request("GET", url, headers=headers[page_num%len(headers)])
plain_text = r.data.decode()
print(plain_text)
except Exception as e:
print(e)
continue soup = BeautifulSoup(plain_text, features="lxml")
ligroup = soup.find_all("li", class_="comment-item") for item in ligroup:
try:
commentator = item.find("div", class_="avatar").a.get("title")
spanlists = list(item.find("div", class_="comment").find("span", class_="comment-info"))
while "\n" in spanlists:
spanlists.remove("\n") if (len(spanlists) == 3) :
stars = spanlists[1].get("title")
stars = switch_case(stars)
commenttime = spanlists[2].string
else:
stars = 0
commenttime = spanlists[1].string content = item.find("span", class_="short").get_text()
add_comment(commentator, stars, commenttime, content)
except Exception as e:
print(e)
continue
page_num+=1
if page_num > 999:
break def switch_case(value):
switcher = {
"力荐":5,
"推荐":4,
"还行":3,
"较差":2,
"很差":1
}
return switcher.get(value, 0) def add_comment(commentator, star, time, content):
conn = sqlite3.connect("spider.db")
cursor = conn.cursor()
cursor.execute("insert into comment values (null, ?, ?, ?, ?)", (commentator, star, time, content))
cursor.close()
conn.commit()
conn.close()

抓取完之后可以在表中看到数据

sqlite> select count(1) from comment;
8302
sqlite> select star,count(1) from comment group by star;
0|1359
1|58
2|133
3|643
4|1875
5|4234
sqlite> select * from comment order by id desc limit 5;
8302|燊栎|4|2014-11-19|经典中的经典
8301|Jerryhere|4|2016-03-08|平凡中的不平凡
8300|麦田睡觉者|5|2012-08-12|这部小说是我上大学看的第一本小说,它带给我的震撼是无与伦比的。彻底将我从高中时看的那些yy小说里震醒。同时,它真的是一部非常好看的小说,平凡的世界里不平凡的人生,生命总是充满苦痛伤悲,这些苦难让生命愈发的沉重厚实
8299|朔望|0|2013-07-29|人生就是如此平凡
8298|mindinthesky|0|2012-09-17|不错,中国就是这样子

2.简单分析

数据抓取完了之后我们进行简单分析,看下各个星的占比

然后在把所有的comment导到文件中,进行词云分析

导出如下:

>sqlite3 -header -csv spider.db "select content from comment;" > commentall.csv

完了就会在当前目录下生成一个commentall.csv的文件

然后可以对其词云分析,代码如下:

def make_cloud():
text = open('commentall.txt', 'r', encoding='utf-8').read()
cut_text = jieba.cut(text)
result = " ".join(cut_text)
wc = WordCloud(
font_path='Deng.ttf', #字体路劲
background_color='white', #背景颜色
width=2000,
height=1200,
max_font_size=100, #字体大小
min_font_size=10,
mask=plt.imread('timg.jpeg'), #背景图片
max_words=1000
)
wc.generate(result)
wc.to_file('jielun.png') #图片保存 plt.figure('jielun') #图片显示的名字
plt.imshow(wc)
plt.axis('off') #关闭坐标
plt.show()

分析完之后的图片输出是下图:

3.情感分析

我们从打的五星和一星能清楚的看到情感,但是对零星的就不太好判断,现在主要是用snowNLP对零星的做情感分析。要想分析,就先得训练,因为目前的是针对电商的评论,不适合现在的场景,怎么训练呢?

首先,我们把5颗星的评论导出存为pos.txt,作为积极的评论,把1颗星的评论导出存为neg.txt作为消极的评论;

然后,利用pos.txt和neg.txt进行训练

最后,在利用训练完的模型对0颗星的进行分析

好了,开始吧

首先导出

>sqlite3 -header -csv spider.db "select conent from comment where star = 5 limit 100;" > pos.csv

>sqlite3 -header -csv spider.db "select conent from comment  where star = 1 limit 100;" > neg.csv

然后找到snownlp的安装路径,如下方法:

kumufengchunMacBook-Pro:douban kumufengchun$ python
Python 3.6.4 (default, Jun 6 2019, 17:59:50)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.10.44.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import snownlp
>>> snownlp
<module 'snownlp' from '/Users/kumufengchun/.pyenv/versions/3.6.4/lib/python3.6/site-packages/snownlp/__init__.py'>

找到了之后,把刚才的pos.scv和neg.csv拷贝到

/Users/kumufengchun/.pyenv/versions/3.6.4/lib/python3.6/site-packages/snownlp/sentiment/下边的pos.txt和neg.txt,为了保持名字一致,我们可以把之前的csv后缀的改为txt
然后开始用刚才导出的数据进行训练,训练完之后的输出保存为commentsentiment.marshal
from snownlp import sentiment
sentiment.train('neg.txt', 'pos.txt')
sentiment.save('commentsentiment.marshal')

然后把训练完输出的文件,在init文件中修改,文件训练完之后输出的是commentsentiment.marshal.3,后缀3是版本的意思,不用管他,在引用的时候不要加3,否则会报错,修改代码如下:

/Users/kumufengchun/.pyenv/versions/3.6.4/lib/python3.6/site-packages/snownlp/sentiment/__init__.py

data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'commentsentiment.marshal')

  

好了,训练完之后,我们可以进行简单的测试

from snownlp import SnowNLP

str = "好很好"
s = SnowNLP(str)
print(s.words)
print(s.tags)
print(s.sentiments)

输出如下:

['好', '很', '好']
<zip object at 0x124963588>
0.6088772592136402

4.用训练的模型进行情感分析

代码如下:

def get_comment_bypage(offset, limit):
conn = sqlite3.connect("spider.db")
cursor = conn.cursor()
cursor.execute('select content from comment where star=0 limit ?,?', (offset, limit))
values = cursor.fetchall()
cursor.close()
conn.close()
return values def analyse_sentiment():
offset = 0
limit = 50
commentcounts = {}
while (offset < 1400):
comments = get_comment_bypage(offset, limit)
for comment in comments:
s = SnowNLP(''.join(comment))
print(s.sentiments)
sentiment = round(s.sentiments, 2)
if sentiment in commentcounts:
commentcounts[sentiment] += 1
else:
commentcounts[sentiment] = 1
offset+=limit
print(commentcounts)
return commentcounts

然后我们把所有的输出做个图如下:

可以看到每个输出所占的数量,如何判断是积极还是消极呢,一般采取0.3,大于0.3的为积极,否则为消极,也可以把之前的数据都跑一遍,定义个区间。

完整的代码如下:

import sys
from os import path
import time
import urllib3
import requests
import numpy as np
import sqlite3
from bs4 import BeautifulSoup
from urllib import parse
from snownlp import SnowNLP
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud
from PIL import Image headers=[{'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},\
{'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'},\
{'User-Agent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'}] def get_comment():
page_num = 0;
total_num = 0;
while(1):
page_num +=1
url = "https://book.douban.com/subject/1200840/comments/hot?p="+str(page_num)
print(url)
http = urllib3.PoolManager()
time.sleep(np.random.rand()*5)
try:
r = http.request("GET", url, headers=headers[page_num%len(headers)])
plain_text = r.data.decode()
print(plain_text)
except Exception as e:
print(e)
continue soup = BeautifulSoup(plain_text, features="lxml")
ligroup = soup.find_all("li", class_="comment-item") for item in ligroup:
try:
commentator = item.find("div", class_="avatar").a.get("title")
spanlists = list(item.find("div", class_="comment").find("span", class_="comment-info"))
while "\n" in spanlists:
spanlists.remove("\n") if (len(spanlists) == 3) :
stars = spanlists[1].get("title")
stars = switch_case(stars)
commenttime = spanlists[2].string
else:
stars = 0
commenttime = spanlists[1].string content = item.find("span", class_="short").get_text()
add_comment(commentator, stars, commenttime, content)
except Exception as e:
print(e)
continue
page_num+=1
if page_num > 999:
break def switch_case(value):
switcher = {
"力荐":5,
"推荐":4,
"还行":3,
"较差":2,
"很差":1
}
return switcher.get(value, 0) def add_comment(commentator, star, time, content):
conn = sqlite3.connect("spider.db")
cursor = conn.cursor()
cursor.execute("insert into comment values (null, ?, ?, ?, ?)", (commentator, star, time, content))
cursor.close()
conn.commit()
conn.close() def get_comment_bypage(offset, limit):
conn = sqlite3.connect("spider.db")
cursor = conn.cursor()
cursor.execute('select content from comment where star=0 limit ?,?', (offset, limit))
values = cursor.fetchall()
cursor.close()
conn.close()
return values def analyse_sentiment():
offset = 0
limit = 50
commentcounts = {}
while (offset < 1400):
comments = get_comment_bypage(offset, limit)
for comment in comments:
s = SnowNLP(''.join(comment))
print(s.sentiments)
sentiment = round(s.sentiments, 2)
if sentiment in commentcounts:
commentcounts[sentiment] += 1
else:
commentcounts[sentiment] = 1
offset+=limit
print(commentcounts)
return commentcounts def make_cloud():
text = open('commentall.txt', 'r', encoding='utf-8').read()
cut_text = jieba.cut(text)
result = " ".join(cut_text)
wc = WordCloud(
font_path='Deng.ttf', #字体路劲
background_color='white', #背景颜色
width=2000,
height=1200,
max_font_size=100, #字体大小
min_font_size=10,
mask=plt.imread('timg.jpeg'), #背景图片
max_words=1000
)
wc.generate(result)
wc.to_file('jielun.png') #图片保存 plt.figure('jielun') #图片显示的名字
plt.imshow(wc)
plt.axis('off') #关闭坐标
plt.show() if __name__=='__main__':
get_comment()
analyse_sentiment()
make_cloud()

参考资料:

https://github.com/isnowfy/snownlp

https://www.cnblogs.com/mylovelulu/p/9511369.html

https://blog.csdn.net/oYeZhou/article/details/82868683

https://blog.csdn.net/hzp666/article/details/78969150

https://www.cnblogs.com/derek1184405959/p/9440526.html

python系列之(4)豆瓣图书《平凡的世界》书评及情感分析的更多相关文章

  1. Python爬虫-爬取豆瓣图书Top250

    豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP.但也不要太频繁爬取. 涉及知识点:requests.html.xpath.csv 一.准备工作 需要安装reques ...

  2. Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析

    文化         经管 ....略 结论: 一个模块的评分与评论数相关,评分为 [8.8——9.2] 之间的书籍评论数往往是模块中最多的

  3. 【Python情感分析】用python情感分析李子柒频道视频热门评论

    一.事件背景 今天是2021.12.2日,距离李子柒断更已经4个多月了,这是我在YouTube李子柒油管频道上,观看李子柒2021年7月14日上传的最后一条视频,我录制了视频下方的来自全世界各国网友的 ...

  4. python系列之(3)爬取豆瓣图书数据

    上次介绍了beautifulsoup的使用,那就来进行运用下吧.本篇将主要介绍通过爬取豆瓣图书的信息,存储到sqlite数据库进行分析. 1.sqlite SQLite是一个进程内的库,实现了自给自足 ...

  5. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

  6. 【Python数据分析】Python3操作Excel-以豆瓣图书Top250为例

    本文利用Python3爬虫抓取豆瓣图书Top250,并利用xlwt模块将其存储至excel文件,图片下载到相应目录.旨在进行更多的爬虫实践练习以及模块学习. 工具 1.Python 3.5 2.Bea ...

  7. Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

    大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...

  8. Python个人项目--豆瓣图书个性化推荐

    项目名称: 豆瓣图书个性化推荐 需求简述:从给定的豆瓣用户名中,获取该用户所有豆瓣好友列表,从豆瓣好友中找出他们读过的且评分5星的图书,如果同一本书被不同的好友评5星,评分人数越多推荐度越高. 输入: ...

  9. python爬虫1——获取网站源代码(豆瓣图书top250信息)

    # -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...

随机推荐

  1. 转载 Python 安装setuptools和pip工具操作方法(必看)

    本文章转载自 脚本之家 http://www.jb51.net  感谢! setuptools模块和pip模块是python进行第三方库扩展的极重要工具,例如我们在需要安装一些爬虫或者数据分析的包时就 ...

  2. Django数据库连接丢失问题

    问题 在Django中使用mysql偶尔会出现数据库连接丢失的情况,错误通常有如下两种 1. OperationalError: (2006, 'MySQL server has gone away' ...

  3. tensorflow/model下的各个参数的理解

    首先,这个对应的proto就是 然后config里面的image_resizer等等 就是proto里面的image_resizer 等等,对应的参数可以在proto里面寻找解释和默认值以及类型 再比 ...

  4. tensorflow中张量的理解

    自己通过网上查询的有关张量的解释,稍作整理. TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中 ...

  5. 移动端 Iphone拍照变横问题的解决

    在移动端的页面需要做用户拍照上传的功能时会有用,苹果即使竖着拍照,上传到网页后它也会变成横的,好像IOS得一个BUG,安卓就没有这个问题. 要解决这个问题需要引入exif.js这个库,网上随便搜一下就 ...

  6. [jnhs]使用netbeans生成的webapp发布到tomcat是需要改名字的,不然就是404Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

    2018-12-21更新 退出tomcat然后删除解压之后的文件夹,然后再启动tomcat也可以解决(安装版tomcat) 2018-12-9更新 有时候这样也可以解决 第一次使用tomcat发布we ...

  7. JavaScript 对象的所有方法名称转换为大写

    function A() { this.do1 = function () { console.log(1); }; this.do2 = function () { console.log(2); ...

  8. Leetcode16.3Sum Closest最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

  9. Oracle启动和禁用约束及删除违反约束的记录

    一.禁用约束 alter table table_name disable novalidate constraint constraint_name 二.批量导入数据 三.在开启约束之前一定要检查违 ...

  10. 手机号测吉凶python代码

    根据数理数来测电话后四位吉凶: 数理数 解释批注 0点特殊.......大吉 1大展鸿图.可获成功吉 2一盛一衰.劳而无功凶 3蒸蒸日上.百事顺遂吉 4坎坷前途.苦难折磨凶 5生意欣荣.名利双收吉 6 ...