python爬取晋江文学城小说评论(情绪分析)

1. 收集数据

1.1 爬取晋江文学城收藏排行榜前50页的小说信息

获取收藏榜前50页的小说列表,第一页网址为 ‘http://www.jjwxc.net/bookbase.php?fw0=0&fbsj=0&ycx0=0&xx2=2&mainview0=0&sd0=0&lx0=0&fg0=0&sortType=0&isfinish=0&collectiontypes=ors&searchkeywords=&page=1' , 第二页网址中page=2,以此类推,直到第50页中page=50。爬取每个小说的ID,小说名字,小说作者。将爬取到的信息存储到晋江排行榜【按收藏数】.txt文件中。

import requests
from bs4 import BeautifulSoup
import bs4
import re
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import jieba
import seaborn as sns
import xlrd
from xlutils.copy import copy
# 一些魔法命令,使得matplotlib画图时嵌入单元中而不是新开一个窗口
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
%load_ext autoreload
%autoreload 2
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
from sklearn.model_selection  import train_test_split
  1. 爬取小说基本信息 ,主要思路;
  2. 找到需要爬取的所有信息主体tbody;
  3. 分别找到每个信息对应的小标签td(a),数清楚在所有标签中的顺序;
  4. 存进txt文档时按顺序存储。
headers = {"User-Agent": "Mozilla/5.0"}
for n in range(1,50):
    url = 'http://www.jjwxc.net/bookbase.php?fw0=0&fbsj=0&ycx0=0&xx2=2&mainview0=0&sd0=0&lx0=0&fg0=0&sortType=0&isfinish=0&collectiontypes=ors&searchkeywords=&page={}'.format(n)
    html = requests.get(url,headers=headers)
    html.encoding = html.apparent_encoding
    soup = BeautifulSoup(html.text, 'html.parser')
    for tr in soup.find_all('tbody'):
            tds=tr('td')
            a = tr('a')
            count=0
            id=[]
            for u in tr.find_all('a'):
                    count=count+1
                    book_url=u.get('href') # 获取小说主页的url
                    p = re.compile(r'\d+')
                    book_id = p.findall(book_url)[0]  # 获取小说ID
                    if(count%2==0):
                        id.append(book_id)
            for n in range(0,100):
                    with open('./data/晋江排行榜【按收藏数】.txt','a+',encoding='utf-8') as f:
                            print("{0}\t{1}\t{2}".format(id[n],a[n*2+1].string,a[n*2].string),file=f)  # 序号 书名 作者

1.2 查看爬虫结果

分别查看前8部小说的ID和名字

# 查看收藏榜前8部小说的ID
with open('./data/晋江排行榜【按收藏数】.txt','r',encoding='utf-8',errors='ignore') as f:
    book_list = f.readlines()
    id_list = [item.split('\t')[0] for item in book_list]
print(id_list[:8])
# 查看收藏榜前8部小说的名字
name_list = [item.split('\t')[1] for item in book_list]
print(name_list[:8])

1.3 ** 爬取每部小说的评论** 。

找到小说的评论区,第一部小说《天官赐福》的第一页评论网址为 ‘http://www.jjwxc.net/comment.php?novelid=3200611&huati=1' ,3200611是小说ID,1是评论页数,这部小说第二页网址为'http://www.jjwxc.net/comment.php?novelid=3200611&huati=2' 。下一部小说《撒野》的ID是2956313,它的第一页评论网址为'http://www.jjwxc.net/comment.php?novelid=2956313&huati=1' ,以此类推,爬取所有小说的评论和打分。为了避免有一些小说评论数不够多,自己设定每部小说只爬取5页的评论。

爬取思路与爬取小说信息大致相同,不同的是将爬取到的信息存储到xls文件中。

headers = {"User-Agent": "Mozilla/5.0"}
with open('./data/晋江排行榜【按收藏数】.txt','r',encoding='utf-8') as f:
            book_list = f.readlines()
            id_list = [item.split('\t')[0] for item in book_list]
for book_id in id_list:
    for page in range(1,6):
        url="http://www.jjwxc.net/comment.php?novelid={}&huati=1&page={}".format(book_id,page)
        html = requests.get(url,headers=headers)
        html.encoding = html.apparent_encoding
        soup = BeautifulSoup(html.text, 'html.parser')
        scores=[]
        comments=[]
        for item1 in soup.find_all('span',"coltext"):
            score=item1('span')
            scores.append(score[2].string)
        for item2 in soup.find_all('div',"readbody"):
            comment=item2('span')
            comments.append(comment[0].string)
        for i in range(0,len(comments)):
            excel = xlrd.open_workbook('./data/jjwxc1.xls')
            wb = copy(excel)
            w_sheet = wb.get_sheet(0)
            sheet = excel.sheets()[0]
            nrow = sheet.nrows # 文件行数
            w_sheet.write(nrow, 0, book_id)
            w_sheet.write(nrow, 1, comments[i])
            w_sheet.write(nrow, 2, scores[i])
            wb.save('./data/jjwxc1.xls')

2. 数据加载和预处理

预处理包括:

  • 格式转化;上一步将爬取信息存到了xls文件,将xls格式文件转化为csv格式文件方便下一步加载。
  • 数据去重;爬取过程中某些页面爬取了多次,导致csv文件包含重复的行。
  • 短评去重;对同一部小说,或者不同的小说,可能存在评论内容相同的行。
  • 添加情绪标签
  • 去除停用词和分词
  • 短评可视化

2.1 格式转化

使用pandas模块可以快速将xls文件转换为.csv

# 格式转化
ex=pd.read_excel("./data/jjwxc.xls")
ex.to_csv("./data/jjwxc.csv",encoding="gb18030")
# 加载评论
review = pd.read_csv("./data/jjwxc.csv",names=['ID','comment','score'],encoding='gb18030')

2.2 数据去重

去除重复的行

# 去重
review = review.drop_duplicates()

2.3 短评去重

去除评论相同的行

# 删除评论内容重复的行
review= review.drop_duplicates('comment')
review.shape

2.4 添加情绪标签

根据打分的分数来添加情绪标签,观察晋江文学城的打分机制发现,打分区间在[-2,2]内,且打2分的人数占大多数,于是将分数为2的评论看作是好评,情绪标签为1,而低于2分的看作是差评,情绪标签为0。

# 添加情绪标签
review['emotion'] = (review.score ==2) * 1
# 打乱顺序
review = review.sample(frac=1).reset_index(drop=True)
print(review.shape)

2.5 去除停用词和分词

短评内容进行分词并去掉停用词

def review_without_stop(review):
    # 打开停用词文件
    with open("./data/emotion_stopwords.txt","r",encoding="utf-8") as f:
        stop_word = [x.strip() for x in f.readlines()]
    all_stop_words = set(stop_word) # 删除停用词中重复的项
    # 短评中的非中文字符替换为''
    review = re.sub("[^\u4e00-\u9fa5]",'',review)
    # 去除全角空白字符
    review = review.replace("\u3000","")
    # 分词
    review = jieba.cut(review)
    # 过滤一个字的词
    review = filter(lambda x: len(x)>1,review)
    # 去除停用词
    review = filter(lambda x: x not in all_stop_words,review)
    return ' '.join(review)
# 自定义分词字典
jieba.load_userdict("./data/emotion_userdict.txt")
review['cut_jieba'] = review.comment.apply(review_without_stop)

【注】停用词和分词文件需要自己定义

# 查看一些评论
review.head()

# 好评中一些评论包含“不想”,“不喜欢”
review[(review['cut_jieba'] == '不想') & (review['emotion'] == 1)]
review[(review['cut_jieba'] == '不喜欢') & (review['emotion'] == 1)]
# 好评中出现的消极情绪词,去除这些评论
def change_negtive_like(cut_text):
    word_list = cut_text.split()
    if "不喜欢" in word_list:
        for i in range(len(word_list)):
            if word_list[i] == "不喜欢":
                word_list[i] = ""
        return " ".join(word_list)
    elif "不想" in word_list:
        for i in range(len(word_list)):
            if word_list[i] == "不想":
                word_list[i] = ""
        return " ".join(word_list)
    else:
        return cut_text
review.loc[review['emotion'] == 1,'cut_jieba'] = review[review['emotion'] == 1].cut_jieba.apply(change_negtive_like)
# 一些评论内容为空,去除这些为空的评论
review = review[~(review['cut_jieba'] == '')]
review.shape

2.6 短评可视化

对所有短评进行可视化

from wordcloud import WordCloud
from imageio import imread
mask = imread("./data/cloud.jpg")
font = './data/FZSTK.TTF'
wc = WordCloud(
    font_path= font,
    max_words=2000, # 设置最大现实的字数
    max_font_size=250,# 设置字体最大值
    background_color = "white",
    random_state=30,
    mask = mask)
wc.generate(''.join(review['cut_jieba'])) # 生成词云
plt.imshow(wc)
plt.axis('off')

对emotion为1的短评进行可视化

from wordcloud import WordCloud
from imageio import imread
mask = imread("./data/piggy.jpg")
font = './data/FZSTK.TTF'
wc1 = WordCloud(
    font_path= font,
    max_words=2000, # 设置最大现实的字数
    max_font_size=300,# 设置字体最大值
    background_color = "white",
    random_state=30,
    mask = mask)
wc1.generate(''.join(review['cut_jieba'][review['emotion']==1]))
plt.imshow(wc1)
plt.axis('off')

对score为-2的短评进行可视化

wc1.generate(''.join(review['cut_jieba'][review['score']==-2])) # 生成词云
plt.imshow(wc1)
plt.axis('off')

【注】词云和字体自己定义

3. 训练模型

3.1 建立训练数据集和测试数据集

由于已经为分析准备好了数据,所以现在需要将数据分成训练数据集和测试数据集。将数据分成两部分:75%的训练数据和25%的测试数据。

x, y = review['cut_jieba'], review['emotion']
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.25) 
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

3.2 特征提取

使用 sklearn 包中的 TfidfVectorizer 方法进行特征提取。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer(decode_error='ignore',
                             token_pattern=r"\b[^\d\W]\w+\b", # 剔除向量化结果中的数字
                             analyzer='word',
                             ngram_range=(2,4),
                            max_df = 0.8,
                            min_df = 3)
Xtrain = tfidf_vect.fit_transform(x_train)
Xtest = tfidf_vect.transform(x_test)
print(Xtrain.shape)
print(Xtest.shape)

3.3 用朴素贝叶斯完成中文文本分类器

from sklearn.naive_bayes import MultinomialNB
review_classifier = MultinomialNB()
review_classifier.fit(Xtrain,y_train)
# 对测试集的样本进行预测
y_pred = review_classifier.predict(Xtest)
metrics.confusion_matrix(y_test, y_pred) # 混淆矩阵
# 利用 sns 模块查看测试值和预测值构成的热图
colorMetrics = metrics.confusion_matrix(y_test, y_pred)
sns.heatmap(colorMetrics,annot=True,fmt='d')

# 分类报告
# 给出每个类的准确率,召回率和F值,以及这三个参数和宏平均值
print(metrics.classification_report(y_test,y_pred)) 

print(metrics.accuracy_score(y_test,y_pred))
from sklearn.model_selection import cross_val_score
score1 = cross_val_score(review_classifier,Xtrain,y_train,cv=10,scoring="accuracy").mean()
print(score1)

3.4 用逻辑回归完成中文文本分类

from sklearn.linear_model import LogisticRegression
LR_model = LogisticRegression(penalty='l2',max_iter=3000)
LR_model.fit(Xtrain,y_train)
# 对测试集的样本进行预测
y_pred = LR_model.predict(Xtest)
metrics.confusion_matrix(y_test, y_pred) # 混淆矩阵
print(LR_model.score(Xtest,y_test))
# 给出每个类的准确率,召回率和F值,以及这三个参数和宏平均值
print(metrics.classification_report(y_test,y_pred))

4. 结果分析

(1)词云分析:

  1. 词云1中最明显的词汇是“喜欢”;
  2. 词云2中的词汇与词云1区别不大,因为所有短评中好评占大多数;
  3. 由差评生成的词云3出现了“不好”、“一般”、“硬伤”等负面色彩的词语。

(2)影响情感分析准确性的原因:

  1. 获取到的短评数量比较少;
  2. 由于小说中对主角讨论比较多,一些小说角色名字会重复出现在短评内,一定程度影响对评论的感情分析;
  3. 没有删除过于短小的评论;
  4. 分词后中发现代表积极或消极情绪的词汇往往不会成为单独短评,而是和别的词一起出现,对于查找差评中的积极词汇和好评中的消极词汇造成一定困难。
  5. 短评中出现明显代表正面色彩和负面色彩的词汇较少。

到此这篇关于爬取晋江文学城小说评论(情绪分析)的文章就介绍到这了,希望对你有所帮助,更多相关python爬取内容请搜索我们以前的文章或继续浏览下面的相关文章,希望大家以后多多支持我们!

(0)

相关推荐

  • python爬虫之爬取笔趣阁小说

    前言 为了上班摸鱼方便,今天自己写了个爬取笔趣阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 一.首先导入相关的模块 import os import requests from bs4 import BeautifulSoup 二.向网站发送请求并获取网站数据 网站链接最后的一位数字为一本书的id值,一个数字对应一本小说,我们以id为1的小说为示例. 进入到网站之后,我们发现有一个章节列表,那么我们首先完成对小说列表名称的抓取 # 声明请求头 headers = { 'Use

  • Python爬虫入门教程02之笔趣阁小说爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文 01.python爬虫入门教程01:豆瓣Top电影爬取 基本开发环境 Python 3.6 Pycharm 相关模块的使用 request sparsel 安装Python并添加到环境变量,pip安装需要的相关模块即可. 单章爬取 一.明确需求 爬取小说内容保存到本地 小说名字 小说章节名字 小说内容 # 第一章小说url地址 url = 'http://www.biquges.co

  • Python爬取365好书中小说代码实例

    需要转载的小伙伴转载后请注明转载的地址 需要用到的库 from bs4 import BeautifulSoup import requests import time 365好书链接:http://www.365haoshu.com/ 爬取<我以月夜寄相思>小说 首页进入到目录:http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=3026 获取小说的每个章节的名称和章节链接 打开浏览器的开发者工具,查找一个章节:如下图,找到第一章的

  • python爬虫爬取笔趣网小说网站过程图解

    首先:文章用到的解析库介绍 BeautifulSoup: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能. 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码. 你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了.然后,你仅仅

  • python爬取”顶点小说网“《纯阳剑尊》的示例代码

    爬取"顶点小说网"<纯阳剑尊> 代码 import requests from bs4 import BeautifulSoup # 反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, \ like Gecko) Chrome/70.0.3538.102 Safari/537.36' } # 获得请求 def open_url(url):

  • python 爬取小说并下载的示例

    代码 import requests import time from tqdm import tqdm from bs4 import BeautifulSoup """ Author: Jack Cui Wechat: https://mp.weixin.qq.com/s/OCWwRVDFNslIuKyiCVUoTA """ def get_content(target): req = requests.get(url = target) r

  • Python实现爬取逐浪小说的方法

    本文实例讲述了Python实现爬取逐浪小说的方法.分享给大家供大家参考.具体分析如下: 本人喜欢在网上看小说,一直使用的是小说下载阅读器,可以自动从网上下载想看的小说到本地,比较方便.最近在学习Python的爬虫,受此启发,突然就想到写一个爬取小说内容的脚本玩玩.于是,通过在逐浪上面分析源代码,找出结构特点之后,写了一个可以爬取逐浪上小说内容的脚本. 具体实现功能如下:输入小说目录页的url之后,脚本会自动分析目录页,提取小说的章节名和章节链接地址.然后再从章节链接地址逐个提取章节内容.现阶段只

  • Python实现的爬取小说爬虫功能示例

    本文实例讲述了Python实现的爬取小说爬虫功能.分享给大家供大家参考,具体如下: 想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单的爬虫,可以爬取爬取各个章节的内容,保存到txt文档中,支持持续更新保存.需要配置一些信息,设置文档保存路径,书名等.写着玩,可能不大规范. # coding=utf-8 import requests from lxml import etree from urllib.parse import urljoin import re import os #

  • Python scrapy爬取小说代码案例详解

    scrapy是目前python使用的最广泛的爬虫框架 架构图如下 解释: Scrapy Engine(引擎): 负责Spider.ItemPipeline.Downloader.Scheduler中间的通讯,信号.数据传递等. Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎. Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Respon

  • python爬取晋江文学城小说评论(情绪分析)

    1. 收集数据 1.1 爬取晋江文学城收藏排行榜前50页的小说信息 获取收藏榜前50页的小说列表,第一页网址为 'http://www.jjwxc.net/bookbase.php?fw0=0&fbsj=0&ycx0=0&xx2=2&mainview0=0&sd0=0&lx0=0&fg0=0&sortType=0&isfinish=0&collectiontypes=ors&searchkeywords=&pa

  • Python爬取雪中悍刀行弹幕分析并可视化详程

    目录 哔哔一下 爬虫部分 代码部分 效果展示 数据可视化 代码展示 效果展示 福利环节 哔哔一下 雪中悍刀行兄弟们都看过了吗?感觉看了个寂寞,但又感觉还行,原谅我没看过原著小说~ 豆瓣评分5.8,说明我还是没说错它的. 当然,这并不妨碍它波播放量嘎嘎上涨,半个月25亿播放,平均一集一个亿,就是每天只有一集有点难受. 我们今天就来采集一下它的弹幕,实现数据可视化,看看弹幕文化都输出了什么~ 爬虫部分 我们将它的弹幕先采集下来,保存到Excel表格~ 首先安装一下这两个模块 requests # 发

  • Python爬取网易云音乐热门评论

    最近在研究文本挖掘相关的内容,所谓巧妇难为无米之炊,要想进行文本分析,首先得到有文本吧.获取文本的方式有很多,比如从网上下载现成的文本文档,或者通过第三方提供的API进行获取数据.但是有的时候我们想要的数据并不能直接获取,因为并不提供直接的下载渠道或者API供我们获取数据.那么这个时候该怎么办呢?有一种比较好的办法是通过网络爬虫,即编写计算机程序伪装成用户去获得想要的数据.利用计算机的高效,我们可以轻松快速地获取数据. 那么该如何写一个爬虫呢?有很多种语言都可以写爬虫,比如Java,php,py

  • Python爬取网易云音乐上评论火爆的歌曲

    前言 网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其中也不乏很多感人的评论.但是,网易云音乐并没有提供热评排行榜和按评论排序的功能,没关系,本文就使用爬虫给大家爬一爬网易云音乐上那些热评的歌曲. 结果 对过程没有兴趣的童鞋直接看这里啦. 评论数大于五万的歌曲排行榜 首先恭喜一下我最喜欢的歌手(之一)周杰伦的<晴天>成为网易云音乐第一首评论数过百万的歌曲! 通过结果发现目前评论数过十万的歌曲正好十首,通过这

  • Python爬虫之爬取最新更新的小说网站

    一.引言 这个五一假期自驾回老家乡下,家里没装宽带,用手机热点方式访问网络.这次回去感觉4G信号没有以前好,通过百度查找小说最新更新并打开小说网站很慢,有时要打开好多个网页才能找到可以正常打开的最新更新.为了躲懒,老猿决定利用Python爬虫知识,写个简单应用自己查找小说最新更新并访问最快的网站,花了点时间研究了一下相关报文,经过近一天时间研究和编写,终于搞定,下面就来介绍一下整个过程. 二.关于相关访问请求及应答报文 2.1.百度搜索请求 我们通过百度网页的搜索框进行搜索时,提交的url请求是

  • 用Python爬取QQ音乐评论并制成词云图的实例

    环境:Ubuntu16.4 python版本:3.6.4 库:wordcloud 这次我们要讲的是爬取QQ音乐的评论并制成云词图,我们这里拿周杰伦的等你下课来举例. 第一步:获取评论 我们先打开QQ音乐,搜索周杰伦的<等你下课>,直接拉到底部,发现有5000多页的评论. 这时候我们要研究的就是怎样获取每页的评论,这时候我们可以先按下F12,选择NetWork,我们可以先点击小红点清空数据,然后再点击一次,开始监控,然后点击下一页,看每次获取评论的时候访问获取的是哪几条数据.最后我们就能看到下图

  • python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comments(res): comments_json = json.loads(res.text) hot_comments = comments_json['hotComments'] with open("hotcmments.txt", 'w', encoding = 'utf-8') a

  • Python爬取腾讯视频评论的思路详解

    一.前提条件 安装了Fiddler了(用于抓包分析) 谷歌或火狐浏览器 如果是谷歌浏览器,还需要给谷歌浏览器安装一个SwitchyOmega插件,用于代理服务器 有Python的编译环境,一般选择Python3.0及以上 声明:本次爬取腾讯视频里 <最美公里>纪录片的评论.本次爬取使用的浏览器是谷歌浏览器 二.分析思路 1.分析评论页面 根据上图,我们可以知道:评论使用了Ajax异步刷新技术.这样就不能使用以前分析当前页面找出规律的手段了.因为展示的页面只有部分评论,还有大量的评论没有被刷新出

随机推荐