鱼C论坛

 找回密码
 立即注册
查看: 15386|回复: 55

[技术交流] 《唐人街探案3》值得看吗?【Python+爬虫+可视化 30 秒出答案】

[复制链接]
发表于 2021-2-19 09:26:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-3-3 17:38 编辑

事先声明:

小师妹不生产评论,只是评论的处理工...


春节假期结束啦,小师妹又来用代码搞事情啦!

随着 唐探3 在全国影院的全面上线,大家对于这部电影的评价却是非常的出乎意料,豆瓣目前评分只有区区 5.7 分。



很多影评表示非常的失望。

小师妹作为纯路人,准备爬一下数据,看看口碑到底如何

看完结果,小师妹只想到下面这句话:

二流的作品,比广为流传的作品活得还久,其中有些根本不该问世,却赖着不肯死。
        ——雷蒙德·钱德勒《谋杀的简约之道

剩下自己品~

从豆瓣用 Python 获取了几千条影评数据,一起来看看大家是怎么说的吧。

顺便展示下数据可视化功底。

接下来的内容,偏重“分析”,代码只是简单注释。

涉及到的知识点不做详细讲解啦,大家可以去看小甲鱼老师的教程,链接我都会罗列出来滴。

主要就是两件事:

  • 数据爬取
  • 多维度可视化展示数据并进行分析

废话不多说,开始吧!

生动视频解说版:



数据爬取

由于豆瓣现在有较强的反爬机制,这里小师妹不方便透露具体实现方式。

关键字:

  • 1、免费代理+代理池维护
  • 2、付费代理
  • 3、selenium 慢慢爬

付费的,如果自用也就几块而已~

出于稳定可用,用了付费代理构造一个 url 用 requests 去请求,主入口:

  1. if __name__ == '__main__':
  2.     proxies_list = get_ip()
  3.     can_use_ip_list = check_ip(proxies_list)
  4.     page = 200
  5.     for i in range(1, page + 1):
  6.         time.sleep(random.randint(1, 3))
  7.         print('鱼C秘制小爬虫在爬取第%s页' % i)
  8.         url = 'https://movie.douban.com/subject/27619748/comments?start=%s&limit=20&status=P&sort=new_score' % (
  9.             (i - 1) * 20)
  10.         print(url)
  11.         tree = get_tree(url, can_use_ip_list)
  12.         info_list = parse(tree)
  13.         print('保存中....')
  14.         save(info_list, i)
复制代码

计划大概爬取 10 页,不到 200 条数据。

打开控制台查看标签:
(评论页面:https://movie.douban.com/subject/27619748/comments

2021-02-19_10-17-08.jpg


上面评论的标签都统一放在:

  1. div[@class="comment"]/h3/span[@class="comment-info"]/a/text()
复制代码

到时代码用循环就可以啦!

数据源找到了,写代码批量爬去上面 div 中的:用户名、星级、评论

  1. def parse(tree):
  2.     global comment_set
  3.     info_list = []
  4.     comment_list = tree.xpath(
  5.         '//div[@id="comments"]/div[@class="comment-item "]')
  6.     for com in comment_list:
  7.         comments_user = com.xpath(
  8.             './div[@class="comment"]/h3/span[@class="comment-info"]/a/text()')[
  9.                 0]  # 评论者
  10.         if comments_user in comment_set:
  11.             pass
  12.         else:
  13.             stat_dict = {
  14.                 "10": "一星",
  15.                 "20": "二星",
  16.                 "30": "三星",
  17.                 "40": "四星",
  18.                 "50": "五星",
  19.             }
  20.             comment_star = com.xpath(
  21.                 './div[@class="comment"]/h3/span[@class="comment-info"]/span[2]/@class'
  22.             )[0]  # 星级
  23.             for i in stat_dict:
  24.                 if i in comment_star:
  25.                     comment_star = stat_dict[i]
  26.             try:
  27.                 comment_time = com.xpath(
  28.                     './div[@class="comment"]/h3/span[@class="comment-info"]/span[3]/text()'
  29.                 )[0].split()[0]  # 评论时间
  30.             except:
  31.                 comment_time = ""
  32.             comment = com.xpath(
  33.                 './div[@class="comment"]/p[@class=" comment-content"]/span/text()'
  34.             )[0]  # 评论
  35.             comment_set.add(comments_user)
  36.             info_list.append(
  37.                 [comments_user, comment_star, comment_time, comment])
  38.     return info_list
复制代码

将数据存到 csv 中:

  1. def save(item, title=None):
  2.     # 创建文件对象
  3.     try:
  4.         if title == 1:
  5.             content_list = ['评论者', '评论星级', '评论时间', '评论内容']
  6.             with open('./唐探三.csv', 'a+', newline='',
  7.                       encoding='utf-8-sig') as file:
  8.                 writer = csv.writer(file, delimiter=',')
  9.                 writer.writerow(content_list)
  10.                 writer.writerows(item)
  11.         if title == 1:
  12.             print('>>>创建表格成功,并加入标题成功!')
  13.         else:
  14.             print('>>>写入成功!')
  15.     except:
  16.         pass
复制代码

搞定,看结果(节选):

2021-02-19_22-17-34.jpg


很尴尬,至于多尴尬,我们用词云来看下。

不过先看下随着日期,评分的趋势变化。


评分趋势

从上面数据中我们可以看到有日期星级

咱们就可以用 Matplotlib,基于这两个数据做一个趋势图!

其中星级我们需要先按照进行求和算平均:

  1. file = csv.reader(f)
  2.         sum_start_12 = 0
  3.         sum_start_13 = 0
  4.         sum_start_14 = 0
  5.         sum_start_15 = 0
  6.         sum_start_16 = 0
  7.         count_12 = 0
  8.         count_13 = 0
  9.         count_14 = 0
  10.         count_15 = 0
  11.         count_16 = 0
  12.         date_list = []
  13.         for line, comment in enumerate(file):
  14.             if line != 0:
  15.                 date_list.append(comment[2])
  16.                 # print(line,comment)
  17.                 if comment[2] == '2021-02-12':
  18.                     sum_start_12 += movie_start_dict[comment[1]]
  19.                     count_12 += 1
  20.                 elif comment[2] == '2021-02-13':
  21.                     sum_start_13 += movie_start_dict[comment[1]]
  22.                     count_13 += 1
  23.                 elif comment[2] == '2021-02-14':
  24.                     sum_start_14 += movie_start_dict[comment[1]]
  25.                     count_14 += 1
  26.                 elif comment[2] == '2021-02-15':
  27.                     sum_start_15 += movie_start_dict[comment[1]]
  28.                     count_15 += 1
  29.                 elif comment[2] == '2021-02-16':
  30.                     sum_start_16 += movie_start_dict[comment[1]]
  31.                     count_16 += 1
  32.         star_list = [
  33.             sum_start_12 / count_12, sum_start_13 / count_13,
  34.             sum_start_14 / count_14, sum_start_15 / count_15,
  35.             sum_start_16 / count_16
  36.         ]
复制代码

输出看结果:

2021-02-21_12-14-43.jpg


很明显随着日期增长,评分一路下滑...

除了折线图,还可以适当修改代码(直接看评分占比):

  1. with open('Ori.csv', 'r', encoding='utf-8') as f:
  2.         file = csv.reader(f)
  3.         one = 0
  4.         two = 0
  5.         three = 0
  6.         four = 0
  7.         five = 0
  8.         for line, comment in enumerate(file):
  9.             if line != 0:
  10.                 # print(line, comment)
  11.                 if comment[1] == '一星':
  12.                     one += 1
  13.                 elif comment[1] == '二星':
  14.                     two += 1
  15.                 elif comment[1] == '三星':
  16.                     three += 1
  17.                 elif comment[1] == '四星':
  18.                     four += 1
  19.                 elif comment[1] == '五星':
  20.                     five += 1
  21.         groups = ["1星", "2星", "3星", "4星", "5星"]
  22.         offsets = [0, 0, 0, 0, 0]
  23.         rng = np.random.RandomState(27)
  24.         sj = [one, two, three, four, five]
  25.         plt.pie(sj,
  26.                 labels=groups,
  27.                 explode=offsets,
  28.                 autopct='%1.1f%%',
  29.                 startangle=90,
  30.                 shadow=True)  
  31.         plt.title(u"星级饼图")
  32.         plt.show()
复制代码

图:

2021-02-21_14-03-44.jpg


五星好评占比 9.9%,剩下都是......


内容词云

词云文档:词云——将你的数据可视化的一种炫酷方案

小甲鱼老师已经讲过词云玩法,去看上面的文章。

词云往往能直观显示出内容中的高频词,上才艺:

  1. import wordcloud
  2. file = open(r"Ori.csv", encoding="utf-8")
  3. text = file.read()
  4. stopwords = {"一星", "二星", "三星", "四星", "五星", "world", "评论内容", "评论星数"}
  5. wc = wordcloud.WordCloud(font_path=r"Hiragino Sans GB.ttc",
  6.                          stopwords=stopwords)
  7. wc.generate(text)
  8. image = wc.to_image()
  9. image.show()
复制代码

结果:

游客,如果您要查看本帖隐藏内容请回复


可以看到,影评者中对于 唐探3 的评论中几乎没有关于“喜欢”、“好看”等等关键词。

反而出现了XXX、XXXXX等关键词...

这......嗯...群众的眼睛是雪亮滴。

欢迎有看过的童鞋们在下方留言交流心得...

评分

参与人数 6荣誉 +19 鱼币 +16 贡献 +15 收起 理由
小伤口 + 2 + 2 感谢楼主无私奉献!
乙烯依旧 + 3 + 2 + 3
qq1151985918 + 2 无条件支持楼主!
zy990106 + 5 + 1 + 3
qiuyouzhi + 3 + 3 + 3 无条件支持楼主!
不二如是 + 6 + 6 + 6 冲鸭

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-20 08:31:06 | 显示全部楼层
吐了好理解,这36D是个什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2021-2-20 08:37:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-21 11:09:09 | 显示全部楼层
本帖最后由 鱼C-小师妹 于 2021-2-21 11:10 编辑
彩虹七号 发表于 2021-2-20 08:31
吐了好理解,这36D是个什么意思


我也母鸡啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-22 12:15:38 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-22 13:38:16 From FishC Mobile | 显示全部楼层
鱼C-小师妹 发表于 2021-2-21 11:09
我也母鸡啊

???车车
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 15:14:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-22 20:16:53 | 显示全部楼层
观摩观摩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 09:35:54 | 显示全部楼层
为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 14:57:50 | 显示全部楼层
docjr 发表于 2021-2-23 09:35
为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多

豆瓣本身没有评星的数据哦,这个是自己算的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:13:15 | 显示全部楼层
36D,这是撒哈子?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:58:10 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-24 09:02:46 | 显示全部楼层
docjr 发表于 2021-2-23 09:35
为什么评星分布跟豆瓣显示的不一样 豆瓣三星比例比较多

那这个代码可以用于别的电影吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-24 13:45:30 | 显示全部楼层

可能是罩杯  我没看过这部  不知道瞎猜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-24 14:05:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-24 16:44:49 | 显示全部楼层
docjr 发表于 2021-2-24 09:02
那这个代码可以用于别的电影吗

当然啦~方法一样的,稍做修改即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-24 18:33:22 | 显示全部楼层
可以提供源码下载吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-25 09:19:48 | 显示全部楼层
关键词可太逗了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-25 11:31:10 | 显示全部楼层
wow~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-25 15:59:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 21:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表