使用requests爬取统计豆瓣上大陆和香港的喜剧片评分

通过对豆瓣网站上中国大陆和香港喜剧片评分数据的爬取,分析了1990年至2019年各年代喜剧片的平均评分变化趋势,揭示了喜剧片数量与质量之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据爬取

因为近几年有一些喜剧片是我个人认为不错,但群众评价不太好,所以我爬取了豆瓣上收录了的大陆和香港的喜剧片的评分,并按年代分别统计平均分。

这次爬取的数据是通过豆瓣分类页面获取的https://movie.douban.com/tag/#/,在这个打开页面用开发者工具的network面板

打开这个链接可以看到是获取了一个json页面,里面放了20条电影的信息。

每次点击加载更多的时候,就是获取了不同的json文件,不选择任何筛选条件的json链接是这样的:https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0

其中主要要修改的关键字是start,start的值就是从第这条信息开始的20条信息,start=0就是从0开始的20条电影信息。

然后筛选条件为中国大陆、喜剧、90年代

 然后在network面板里可以看到加载的链接为https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0&genres=喜剧&countries=中国大陆&year_range=1990,1999

所以格式化链接为https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&genres=喜剧&countries={}&year_range={},将开始位置、地区和年代格式化,因为这次只爬喜剧,所以类别写死。

另外豆瓣这个获取好像有上限,不设筛选条件,start=9980或者更大的时候就没有数据了,不知道是豆瓣限制还是我操作有问题,所以如果要获取整个电影库的话,只能每个筛选条件都选上然后遍历,最后合并去重,最大化能获取到的电影信息数量。

这里是把电影信息爬取到json的代码

import requests,os,json
from time import sleep

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
url = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&genres=喜剧&countries={}&year_range={}'
count = [str(i) for i in range(0, 9961, 20)]
area = ['中国大陆', '中国香港']
year = ['1990,1999', '2000,2009', '2010,2019']
for a in area:
    for y in year:
        movieList = []  # 一个年代一个movieList
        for c in count:
            p_url = url.format(c, a, y)  # 格式化链接
            res = requests.get(p_url, header).text
            if not eval(res)['data']:  # 判断有没有数据,没有数据代表这个年代的喜剧电影已经爬取完
                break
            dataList = eval(res)['data']
            for data in dataList:
                if data['rate']:  # 因为豆瓣有很多电影是没有评分的,rate值是一个空字符串,没有价值,不需要加入列表
                    movieList.append(data)
            sleep(3)  # 我看别人说豆瓣有限制每分钟的访问次数,我没有代理池,就降低爬虫速度
            print(y, c)
        if not os.path.isdir(a):
            os.makedirs(a)
        with open(a+"/"+y+".json", "w", encoding="utf-8")as f:
            json.dump(movieList, f, indent=4, ensure_ascii=False)  # 将movieList写入json,因为有中文字符,所以要设置ensure_ascii为False

其实这个代码也还是有问题的,爬取之后检查数据的时候发现数据好像有点少,我把出问题的那一页数据拿出来判断有没有data键,然后出现了syntaxerror:non-utf-8 code错误,在第一行加入编码信息就能解决。

# coding=utf-8

但是设置了这个之后,在爬取完大陆喜剧,爬香港喜剧的时候还是出现invalid syntax错误,之后跳过大陆直接开始爬取香港喜剧的时候却没有报错了,分析不出是哪里出了问题。

数据统计分析

在前面的代码执行完毕之后,会创建六个json文件,分别遍历每个json文件,获取每一条数据的rate值计算平均值。

代码是这个

import json

area = ['中国香港', '中国大陆']  # 两个文件夹的名字
year = ['1990,1999', '2000,2009', '2010,2019']  # json文件的名字
for a in area:
    for fname in year:
        score = []
        with open(a+"/"+fname+'.json', "r", encoding="utf-8")as f:
            data = json.load(f)
        for movie in data:  # 把所有score添加到一个列表里面
            score.append(float(movie['rate']))
        print("%s%s:%.1f 喜剧数量:%d" % (a, fname, sum(score)/len(score), len(data)))

这个处理很粗糙,只计算了分数的平均分和各个年代的喜剧数量,最后的打印结果是

中国香港1990,1999:6.8 喜剧数量:408
中国香港2000,2009:6.3 喜剧数量:330
中国香港2010,2019:5.7 喜剧数量:273
中国大陆1990,1999:7.5 喜剧数量:97
中国大陆2000,2009:6.9 喜剧数量:370
中国大陆2010,2019:5.4 喜剧数量:1683

香港和大陆喜剧每个年代的喜剧平均分都有下降。

而大陆平均分下降了2.1分,可以认为是喜剧数量激增的同时,品质把控不好。而90年代的97部喜剧达到了7.5的平均分,这个分数可以说是很高的了,到了2010年代,喜剧数量剧增到1683部,但是分数却降到了5.4分,可见这二十年激增的一千多部喜剧里,低质量的喜剧占比更重,而在评分下降的同时,可能还会让观众逐渐失去对喜剧的信心。

香港喜剧的平均分也有较大的下降,但是同时香港的喜剧电影数量明显的减少了,原因可能是香港导演不愿意拍喜剧片,也可能跟香港影视人纷纷北上有关,留下了走不出香港的那部分喜剧人。

 

最后,这份数据的缺点其实挺多的,因为有很多电影的地区不止一个,比如大话西游的制作地区是香港+大陆,这样这部电影就会统计两次,而且有不少电影的制作地区都是香港+大陆,这样出来的最后这个统计结果其实并不能说十分准确,是参考价值较低的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穴居人枭子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值