《攀登者》影评爬取及分析

0、项目结构

其中simkai.ttf为字体文件,Windows查看系统自带的字体

C:\Windows\Fonts

一、爬取豆瓣影评数据

# -*- coding: utf-8 -*-
"""爬取豆瓣影评"""
import requests
from lxml import etree
import time url = "https://movie.douban.com/subject/30413052/comments?start=%d&limit=20&sort=new_score&status=P" #请求头
headers = {'Host': 'movie.douban.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
#'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Cookie': 'bid=TXwfIvNFTRE; douban-fav-remind=1; __gads=ID=e042951d078c30b3:T=1570518321:S=ALNI_Mbp-ZmoryuBFEnTQy24mwdf0B89ig; __utma=30149280.1448315194.1570518324.1570518324.1572927825.2; __utmz=30149280.1570518324.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; _pk_id.100001.4cf6=589509e524ead00f.1572927824.1.1572927824.1572927824.; _pk_ses.100001.4cf6=*; __utmb=30149280.0.10.1572927825; __utmc=30149280; __utma=223695111.1094105223.1572927825.1572927825.1572927825.1; __utmb=223695111.0.10.1572927825; __utmc=223695111; __utmz=223695111.1572927825.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ap_v=0,6.0',
'Upgrade-Insecure-Requests': '1',
'Cache-Control': 'max-age=0'} if __name__ == '__main__': f = open("./climb.csv", mode="w", encoding='utf-8')
f.write("author\tcomment\tvotes\n") #start:0,20,40,...,200
for i in range(11):#range左闭右开
#1拼接url,只能获取前11页数据
if i == 10:#最后一页
url_climb = url%(200)
else:
url_climb = url%(i*20) #2发起请求,设置编码,获取文本内容
response = requests.get(url_climb, headers = headers)
response.encoding = "utf-8"
text = response.text #存储
#with open("./climb.html", mode="w", encoding="utf-8") as f:
# f.write(text) #使用etree解析
html = etree.HTML(text)
comments = html.xpath('//div[@id="comments"]/div[@class="comment-item"]')
for comment in comments:
#获取评论人
author = comment.xpath('./div[@class="avatar"]/a/@title')[0].strip()
#获取评论内容
p = comment.xpath('.//span[@class="short"]/text()')[0].strip() #获取这条评论对应的点赞数
vote = comment.xpath('.//span[@class="votes"]/text()')[0].strip() #print(author, p, vote)
f.write("%s\t%s\t%s\n" % (author,p,vote)) #打印提示信息,并休眠一秒,反爬虫
print("第%d页的数据保存成功" % (i+1))
time.sleep(1) f.close()

二、对评论信息进行情感分析

# -*- coding: utf-8 -*-
"""
pandas:python data analysis lib,返回值为DataFrame(行,列),行是样本,列为属性
"""
import pandas as pd
from snownlp import SnowNLP # 显示所有列
pd.set_option('display.max_columns', None) def convert(comment):
"""将传入的评论进行情感分析"""
snow = SnowNLP(str(comment))
sentiments = snow.sentiments#0(消极评论)-1(积极评论)
return sentiments if __name__ =='__main__': data = pd.read_csv('./climb.csv', '\t')
#print(data.head(), "\n", data.shape) #获取评论数据,进行情感分析,DataFrame就会新增加一列名为‘情感评分’的数据
data['情感评分'] = data.comment.apply(convert)
data.sort_values(by='情感评分', ascending=False, inplace=True) #保存数据
data.to_csv('./climb_snownlp.csv', sep='\t', index=False, encoding='utf-8') print(data[:5])
print(data[-5:])

三、对评论数据进行jieba分词,生成关键词条形图和词云

# -*- coding: utf-8 -*-

import pandas as pd
import jieba
from jieba import analyse
import matplotlib.pyplot as plt
import numpy as np
import wordcloud
from PIL import Image if __name__ == '__main__':
data = pd.read_csv('./climb.csv', sep='\t') #列表生成式,获取所有评论信息
comments = ';'.join([str(c) for c in data['comment'].tolist()])
#print(comments) #使用jieba库对文本进行分词,返回的是生成器
gen_ret = jieba.cut(comments)
seg_words = '/'.join(gen_ret)
#print(seg_words) #对分好的词进行分析,topK返回的关键词个数,withWeight带着权重
tags_ret = analyse.extract_tags(seg_words, topK=500, withWeight=True)
#print(tags_ret)
#将数据转换成DataFrame
df_ret = pd.DataFrame(tags_ret, columns=['词语', '重要性'])
df_ret.sort_values(by='重要性', ascending=False, inplace=True)#根据重要性降序排列
#print(df_ret) #可视化,500个词语,选取前20个分析
plt.barh(y=np.arange(0,20), width=df_ret[:20]['重要性'][::-1])
plt.ylabel('Importance')
plt.yticks(np.arange(0,20), labels=df_ret[:20]['词语'][::-1], fontproperties='KaiTi')
#保存条形图!!!保存代码一定要写在show之前,dpi表示屏幕像素密度
plt.savefig('./条形图_20个keyword.jpg', dpi=200)
plt.show() #词云操作
bg = np.array(Image.open('./bg.jpg'))#词云的图片
words = dict(tags_ret)#将标签转为词典
cloud = wordcloud.WordCloud(width=1200, height=968,
font_path='./simkai.ttf',#字体路径
background_color='white', mask=bg,
max_words=500, max_font_size=150)
#生成词云图片
word_cloud = cloud.generate_from_frequencies(words)
plt.figure(figsize=(12,12))
plt.imshow(word_cloud)
#词云保存
plt.savefig('./攀登者词云.jpg', dpi=200)
plt.show()

python爬虫及结巴分词《攀登者》影评分析的更多相关文章

  1. Python 爬虫实战(1):分析豆瓣中最新电影的影评

    目标总览 主要做了三件事: 抓取网页数据 清理数据 用词云进行展示 使用的python版本是3.6 一.抓取网页数据 第一步要对网页进行访问,python中使用的是urllib库.代码如下: from ...

  2. python调用jieba(结巴)分词 加入自定义词典和去停用词功能

    把语料从数据库提取出来以后就要进行分词啦,我是在linux环境下做的,先把jieba安装好,然后找到内容是build jieba PKG-INFO setup.py test的那个文件夹(我这边是ji ...

  3. Python爬虫学习==>第十一章:分析Ajax请求-抓取今日头条信息

    学习目的: 解决AJAX请求的爬虫,网页解析库的学习,MongoDB的简单应用 正式步骤 Step1:流程分析 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: ...

  4. Python爬虫+可视化教学:爬取分析宠物猫咪交易数据

    前言 各位,七夕快到了,想好要送什么礼物了吗? 昨天有朋友私信我,问我能用Python分析下网上小猫咪的数据,是想要送一只给女朋友,当做礼物. Python从零基础入门到实战系统教程.源码.视频 网上 ...

  5. python爬虫---实现项目(四) 用BeautifulSoup分析新浪新闻数据

    这次只演示了,如何在真实项目内用到BeautifulSoup库来解析网页,而新浪的新闻是ajax加载过来的数据,在这里我们只演示解析部分数据(具体反扒机制没做分析). 代码地址:https://git ...

  6. 智联招聘的python岗位数据结巴分词(二)

    上次获取第一次分词之后的内容了 但是数据数据量太大了 ,这时候有个模块就派上用场了collections模块的Counter类 Counter类:为hashable对象计数,是字典的子类. 然后使用m ...

  7. 智联招聘的python岗位数据结巴分词(一)

    如何获取数据点击这里 下载之后的文件名为:all_results.csv 数据样式大概这样.然后下面我分析的是工作要求  也就是那边的绿框那一列. import csv import os impor ...

  8. Python爬虫之抓取豆瓣影评数据

    脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...

  9. Python爬虫系列(五):分析HTML结构

    今晚,被烦死了.9点多才下班,就想回来看书学习,结果被唠叨唠叨个小时,我不断喊不要和我聊天了,还反复说.我只想安安静静看看书,学习学习,全世界都不要打扰我 接着上一个讨论,我们今晚要分析HTML结构了 ...

随机推荐

  1. Java学习之==>注释、数据类型、变量、运算符

    一.注释 在Java中有3种标记注释的方式,最常用的方式是 // ,其注释的内容从 // 开始,到本行结束.但需要注意的是,我们不建议把注释写在代码的尾部(即尾注释),我们建议把注释写在代码的上一行, ...

  2. 【LeetCode】123、买卖股票的最佳时机 III

    Best Time to Buy and Sell Stock III 题目等级:Hard 题目描述: Say you have an array for which the ith element ...

  3. Hand on Machine Learning第三章课后作业(1):垃圾邮件分类

    import os import email import email.policy 1. 读取邮件数据 SPAM_PATH = os.path.join( "E:\\3.Study\\机器 ...

  4. vue ----》实现打印功能

    1.安装打印相关依赖 cnpm install vue-print-nb --save 2.安装后,在main.js文件中引入 import Print from 'vue-print-nb' Vue ...

  5. Spring MVC 中使用AOP 进行统一日志管理--XML配置实现

    1.介绍 上一篇博客写了使用AOP进行统一日志管理的注解版实现,今天写一下使用XML配置实现版本,与上篇不同的是上次我们记录的Controller层日志,这次我们记录的是Service层的日志.使用的 ...

  6. mysql中char,varchar与text类型的区别

      关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... text  ...

  7. 快速安装create-react-app脚手架

    create-react-app搭建react项目:https://blog.csdn.net/weixin_41077029/article/details/82622106 快速安装create- ...

  8. 洛谷 P3258 松鼠的新家 题解

    题面 貌似这道题暴力加玄学优化就可以AC? 下面是正解: 1.树链剖分: 我们在u到v之间都放一个糖果,可以将松鼠它家u到v的糖果数都加1.每一次将a[i]到a[i+1] (a数组是访问顺序)的节点加 ...

  9. P1216数字三角形

    这是USACO的一道记忆化搜索题,还记得原来学搜索就是被此所困. 给定n深的数,第i层有i个节点,存储有一个数字,询问从第一层走到最后一层所经过节点上数字和的最大值.我们很容易想到枚举所有路径来计算最 ...

  10. Forsaken喜欢数论

    链接:https://ac.nowcoder.com/acm/contest/1221/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言1048 ...