|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 鱼C-小师妹 于 2021-3-3 17:38 编辑
事先声明:
春节假期结束啦,小师妹又来用代码搞事情啦!
随着 唐探3 在全国影院的全面上线,大家对于这部电影的评价却是非常的出乎意料,豆瓣目前评分只有区区 5.7 分。
很多影评表示非常的失望。
小师妹作为纯路人,准备爬一下数据,看看口碑到底如何
看完结果,小师妹只想到下面这句话:
二流的作品,比广为流传的作品活得还久,其中有些根本不该问世,却赖着不肯死。
——雷蒙德·钱德勒《谋杀的简约之道
剩下自己品~
从豆瓣用 Python 获取了几千条影评数据,一起来看看大家是怎么说的吧。
顺便展示下数据可视化功底。
接下来的内容,偏重“分析”,代码只是简单注释。
涉及到的知识点不做详细讲解啦,大家可以去看小甲鱼老师的教程,链接我都会罗列出来滴。
主要就是两件事:
废话不多说,开始吧!
生动视频解说版:
数据爬取
由于豆瓣现在有较强的反爬机制,这里小师妹不方便透露具体实现方式。
关键字:
- 1、免费代理+代理池维护
- 2、付费代理
- 3、selenium 慢慢爬
付费的,如果自用也就几块而已~
出于稳定可用,用了付费代理构造一个 url 用 requests 去请求,主入口:
- if __name__ == '__main__':
- proxies_list = get_ip()
- can_use_ip_list = check_ip(proxies_list)
- page = 200
- for i in range(1, page + 1):
- time.sleep(random.randint(1, 3))
- print('鱼C秘制小爬虫在爬取第%s页' % i)
- url = 'https://movie.douban.com/subject/27619748/comments?start=%s&limit=20&status=P&sort=new_score' % (
- (i - 1) * 20)
- print(url)
- tree = get_tree(url, can_use_ip_list)
- info_list = parse(tree)
- print('保存中....')
- save(info_list, i)
复制代码
计划大概爬取 10 页,不到 200 条数据。
打开控制台查看标签:
(评论页面:https://movie.douban.com/subject/27619748/comments)
上面评论的标签都统一放在:
- div[@class="comment"]/h3/span[@class="comment-info"]/a/text()
复制代码
到时代码用循环就可以啦!
数据源找到了,写代码批量爬去上面 div 中的:用户名、星级、评论
- def parse(tree):
- global comment_set
- info_list = []
- comment_list = tree.xpath(
- '//div[@id="comments"]/div[@class="comment-item "]')
- for com in comment_list:
- comments_user = com.xpath(
- './div[@class="comment"]/h3/span[@class="comment-info"]/a/text()')[
- 0] # 评论者
- if comments_user in comment_set:
- pass
- else:
- stat_dict = {
- "10": "一星",
- "20": "二星",
- "30": "三星",
- "40": "四星",
- "50": "五星",
- }
- comment_star = com.xpath(
- './div[@class="comment"]/h3/span[@class="comment-info"]/span[2]/@class'
- )[0] # 星级
- for i in stat_dict:
- if i in comment_star:
- comment_star = stat_dict[i]
- try:
- comment_time = com.xpath(
- './div[@class="comment"]/h3/span[@class="comment-info"]/span[3]/text()'
- )[0].split()[0] # 评论时间
- except:
- comment_time = ""
- comment = com.xpath(
- './div[@class="comment"]/p[@class=" comment-content"]/span/text()'
- )[0] # 评论
- comment_set.add(comments_user)
- info_list.append(
- [comments_user, comment_star, comment_time, comment])
- return info_list
复制代码
将数据存到 csv 中:
- def save(item, title=None):
- # 创建文件对象
- try:
- if title == 1:
- content_list = ['评论者', '评论星级', '评论时间', '评论内容']
- with open('./唐探三.csv', 'a+', newline='',
- encoding='utf-8-sig') as file:
- writer = csv.writer(file, delimiter=',')
- writer.writerow(content_list)
- writer.writerows(item)
- if title == 1:
- print('>>>创建表格成功,并加入标题成功!')
- else:
- print('>>>写入成功!')
- except:
- pass
复制代码
搞定,看结果(节选):
很尴尬,至于多尴尬,我们用词云来看下。
不过先看下随着日期,评分的趋势变化。
评分趋势
从上面数据中我们可以看到有日期和星级。
咱们就可以用 Matplotlib,基于这两个数据做一个趋势图!
其中星级我们需要先按照进行求和算平均:
- file = csv.reader(f)
- sum_start_12 = 0
- sum_start_13 = 0
- sum_start_14 = 0
- sum_start_15 = 0
- sum_start_16 = 0
- count_12 = 0
- count_13 = 0
- count_14 = 0
- count_15 = 0
- count_16 = 0
- date_list = []
- for line, comment in enumerate(file):
- if line != 0:
- date_list.append(comment[2])
- # print(line,comment)
- if comment[2] == '2021-02-12':
- sum_start_12 += movie_start_dict[comment[1]]
- count_12 += 1
- elif comment[2] == '2021-02-13':
- sum_start_13 += movie_start_dict[comment[1]]
- count_13 += 1
- elif comment[2] == '2021-02-14':
- sum_start_14 += movie_start_dict[comment[1]]
- count_14 += 1
- elif comment[2] == '2021-02-15':
- sum_start_15 += movie_start_dict[comment[1]]
- count_15 += 1
- elif comment[2] == '2021-02-16':
- sum_start_16 += movie_start_dict[comment[1]]
- count_16 += 1
- star_list = [
- sum_start_12 / count_12, sum_start_13 / count_13,
- sum_start_14 / count_14, sum_start_15 / count_15,
- sum_start_16 / count_16
- ]
复制代码
输出看结果:
很明显随着日期增长,评分一路下滑...
除了折线图,还可以适当修改代码(直接看评分占比):
- with open('Ori.csv', 'r', encoding='utf-8') as f:
- file = csv.reader(f)
- one = 0
- two = 0
- three = 0
- four = 0
- five = 0
- for line, comment in enumerate(file):
- if line != 0:
- # print(line, comment)
- if comment[1] == '一星':
- one += 1
- elif comment[1] == '二星':
- two += 1
- elif comment[1] == '三星':
- three += 1
- elif comment[1] == '四星':
- four += 1
- elif comment[1] == '五星':
- five += 1
- groups = ["1星", "2星", "3星", "4星", "5星"]
- offsets = [0, 0, 0, 0, 0]
- rng = np.random.RandomState(27)
- sj = [one, two, three, four, five]
- plt.pie(sj,
- labels=groups,
- explode=offsets,
- autopct='%1.1f%%',
- startangle=90,
- shadow=True)
- plt.title(u"星级饼图")
- plt.show()
复制代码
图:
五星好评占比 9.9%,剩下都是......
内容词云
词云文档:词云——将你的数据可视化的一种炫酷方案
小甲鱼老师已经讲过词云玩法,去看上面的文章。
词云往往能直观显示出内容中的高频词,上才艺:
- import wordcloud
- file = open(r"Ori.csv", encoding="utf-8")
- text = file.read()
- stopwords = {"一星", "二星", "三星", "四星", "五星", "world", "评论内容", "评论星数"}
- wc = wordcloud.WordCloud(font_path=r"Hiragino Sans GB.ttc",
- stopwords=stopwords)
- wc.generate(text)
- image = wc.to_image()
- image.show()
复制代码
结果:
可以看到,影评者中对于 唐探3 的评论中几乎没有关于“喜欢”、“好看”等等关键词。
反而出现了XXX、XXXXX等关键词...
这......嗯...群众的眼睛是雪亮滴。
欢迎有看过的童鞋们在下方留言交流心得...
|
评分
-
查看全部评分
|