前段时间忙于备考,博客有段时间没更新了。其实早就有写这篇博客的想法了,原因嘛——我是比较喜欢看电影的,而且近来也对数据分析颇感兴趣,于是花了一天时间,先是爬取数据,再分析整理,数据可视化。
其实豆瓣对爬虫的防范算是比较高级了,即使伪造了 Cookie,还是会封禁 IP(还好我的代理 IP 多😏),甚至还会把你的帐号暂时冻结,其实要不是有一些电影词条必须登录才可见,也不用伪造 Cookie 这么麻烦。
之前爬取都是用的正则匹配,这次首次接触了「 Beautiful Soup 」这个库,相见恨晚啊,不多说,先上代码:
def get_info(url):
movie = {}
proxies = {'https': "socks5://127.0.0.1:1080"}
info = get(url, cookies=read_cookie(), proxies=proxies).text
soup = BeautifulSoup(info)
try:
# get movie name
name = soup.find(property='v:itemreviewed').get_text()
movie['name'] = name.split(' ')[0]
# get movie year
year = soup.find(class_='year').get_text()
movie['year'] = year[1:-1]
# get movie info
info = soup.find(id='info').get_text().replace(' ', '').split('\n')
info = [x for x in info if x is not '']
for item in info:
if '导演:' in item:
movie['director'] = item[3:].split('/')
if '主演:' in item:
movie['actors'] = item[3:].split('/')
if '类型:' in item:
movie['type'] = item[3:].split('/')
if '国家/地区:' in item:
movie['region'] = item[8:].split('/')
if '语言:' in item:
movie['language'] = item[3:].split('/')
if '片长:' in item:
time = [
search(r'[\d]*', x).group() for x in item[3:].split('/')
]
movie['time'] = sorted(time, reverse=True)[0]
# get top250 info
movie['rank'] = soup.find(class_='top250-no').get_text()
movie['number'] = soup.find(property='v:votes').get_text()
except Exception as e:
print(e)
return movie
其中片长取得是无删减版的片长,即不同版本中最长的。
地区、导演、语言等由于会出现多项内容,采取列表存放。
以下统计数据截止至 2018/01/20
其中由「宫崎骏」和「克里斯托弗·诺兰」贡献最多,均为 7 部,具体为:
宫崎骏(日本):
克里斯托弗·诺兰(英国):
其中由「张国荣」贡献最多(前三居然都是香港地区的演员),有 8 部,分别是:
其中「美国」地区一枝独秀,超过半数以上电影的制片地区均为「美国」,且远超第二名「英国」。
统计名称 | 数值 |
---|---|
中位数 | 118.0 |
均值 | 124.0 |
众数 | 98.0(10 次) |
标准差 | 34.1 |
极差 | 218.0 |
其中片长最长的电影为《指环王3:王者无敌》,导演是「彼得·杰克逊」,片长为 263 mins,排名是 No.30。
其中片长最短的电影为《萤火之森》,导演是「大森贵弘」,片长为 45 mins,排名是 No.150。
统计名称 | 数值 |
---|---|
中位数 | 2002.0 |
均值 | 1998.6 |
众数 | 2004(13 次) |
标准差 | 15.6 |
极差 | 85 |
其中距今最久远的电影是《城市之光》,导演是「查理·卓别林」,年份为 1931 年,排名是 No.210。
其中距今最接近的电影有 5 部,均为 2016 年上映:
嘿嘿,没想到吧,贡献电影最多的年份并不是「Top 250」前四名中有三部的 1994 年,而是 2004 年。
统计名称 | 数值 |
---|---|
中位数 | 8.70 |
均值 | 8.78 |
众数 | 8.7(44 次) |
标准差 | 0.27 |
极差 | 1.40 |
其中最高分为 9.6 分,为两部电影所获得:
其中评分最低的电影为《疯狂的石头》,分数是 8.2 分,导演为「宁浩」,评分人数为 312083 人,排名为 No.230
可以看出豆瓣在进行「Top 250」排名时,并不是仅看评分,其中评分人数也占了很大的一部分比重,且似乎还有一些其它的因素,比如《血战钢锯岭》这部电影,评分 8.7,评分人数为 310624 人,却并没有上榜,同为评分 8.7,评分人数为 314940 的电影《看不见的客人》排名却早已进前百(No.83)。
最后,本人并非专业电影人士,无法针对以上数据提出建设性的建议,所做统计也仅仅是出于爱好,也愿自己能在闲暇时间里,多看几部电影。