Python爬取《流浪地球》豆瓣影评与数据分析可视化
大年初一《流浪地球》全国上映。在豆瓣评分上,首日开分站稳8分以上,延续了之前点映的高口碑。微博上跟着出现吴京客串31天与投资6000万的热搜。知乎上关于“如何评价刘慈欣小说改编的同名电影《流浪地球》”的回答引起了众多人关注,包括该片导演郭帆的最高赞回答。
本篇文章爬取了豆瓣网上《流浪地球》的部分影评,并进行数据分析及可视化处理。下面是爬取分析的整个过程,让我们愉快开始吧!
一、网页分析
豆瓣网从2017年10月开始全面禁止爬取数据。在非登录状态下仅仅可以爬取200条短评,登录状态下仅可以爬取500条数据。白天一分钟最多可爬40次,晚上60次,超过次数就会封IP地址。小本聪爬取数据获得400条时被封了IP,账号被强制下线封号,之后发短信账号恢复,因此不建议多次爬取(另外,有很多解决方法,请自行搜索)。
获取对象
评论用户
评论内容
评分
评论日期
用户所在城市
值得注意的是,在地址栏我们会发现电影名字的ID编号为26266893(其他电影只需更换ID即可),并且每页有20条短评,因此我爬取了20页。评论页面没有用户所在城市,需要进入用户页面获取信息。
二、数据获取与存储
1 获取cookies
小本聪用的是Chrome浏览器,Ctrl+F12进入开发者工具页面。F5刷新一下出现数据,找到cookies、headers。
2 加载headers、cookies,并用requests库获取信息
def get_content(id, page):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}cookies = {'cookie': 'bid=GOOb4vXwNcc; douban-fav-remind=1; ps=y; ue="maplekonghou@163.com"; push_noty_num=0; push_doumail_num=0; ap=1; ll="108288"; dbcl2="181095881:BSb6IVAXxCI"; ck=Fd1S; ct=y'}url = "https://movie.douban.com/subject/" + str(id) + "/comments?start=" + str(page * 10) + "&limit=20&sort=new_score&status=P"res = requests.get(url, headers=headers, cookies=cookies)
[/code]**3 解析需求数据**此处运用xpath解析。发现有的用户虽然给了评论,但是没有给评分,所以score和date这两个的xpath位置是会变动的。因此需要加判断,如果发现score里面解析的是日期,证明该条评论没有给出评分。```codefor i in range(1, 21): # 每页20个评论用户name = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/text()'.format(i))# 下面是个大bug,如果有的人没有评分,但是评论了,那么score解析出来是日期,而日期所在位置spen[3]为空score = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[2]/@title'.format(i))date = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[3]/@title'.format(i))m = '\d{4}-\d{2}-\d{2}'try:match = re.compile(m).match(score[0])except IndexError:breakif match is not None:date = scorescore = ["null"]else:passcontent = x.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(i))id = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/@href'.format(i))try:city = get_city(id[0], i) # 调用评论用户的ID城市信息获取except IndexError:city = " "name_list.append(str(name[0]))score_list.append(str(score[0]).strip('[]\'')) # bug 有些人评论了文字,但是没有给出评分date_list.append(str(date[0]).strip('[\'').split(' ')[0])content_list.append(str(content[0]).strip())city_list.append(city)
4 获取电影名称
从url上只能获取电影的subject的8位ID数值,引起需要自行解析网页获取ID号对应的电影名称,该功能是后期改进添加的,因此为避免现有代码改动多(偷个懒),采用了全局变量赋值给
movie_name
,需要注意全局变量调用时,要加 global
声明一下。
pattern = re.compile('<div id="wrapper">.*?<div id="content">.*?<h1>(.*?) 短评</h1>', re.S)global movie_namemovie_name = re.findall(pattern, res.text)[0] # list类型
5 数据存储
由于数据不多,选择CSV存储即可。
def main(ID, pages):global movie_namefor i in tqdm(range(0, pages)): # 豆瓣只开放500条评论get_content(ID, i) # 第一个参数是豆瓣电影对应的id序号,第二个参数是想爬取的评论页数time.sleep(round(random.uniform(3, 5), 2)) # 设置延时发出请求infos = {'name': name_list, 'city': city_list, 'content': content_list, 'score': score_list, 'date': date_list}data = pd.DataFrame(infos, columns=['name', 'city', 'content', 'score', 'date'])data.to_csv(movie_name + ".csv") # 存储名为 电影名.csv
[/code]![](https://mmbiz.qpic.cn/mmbiz_jpg/IUfmic9xda2LVd5DzelxXqzktgwicarUJa9mclibCqlMicu56N16NabVdTglWiarxA8Cbm8Km0cG7SY7D5Y1icA3SMfQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)**三、数据分析与可视化****1** **获取cookies**城市信息筛选中文字```codedef translate(str):line = str.strip()p2 = re.compile('[^\u4e00-\u9fa5]') # 中文的编码范围是:\u4e00到\u9fa5zh = " ".join(p2.split(line)).strip()zh = ",".join(zh.split())str = re.sub("[A-Za-z0-9!!,%\[\],。]", "", zh)return str
匹配pyecharts支持的城市列表
d = pd.read_csv(csv_file, engine='python', encoding='utf-8')motion_list = []for i in d['content']:try:s = round(SnowNLP(i).sentiments, 2)motion_list.append(s)except TypeError:continueresult = {}for i in set(motion_list):result[i] = motion_list.count(i)return result
2 基于snownlp的情感分析
snownlp主要可以进行中文分词(算法是Character-Based Generative Model)、词性标注(原理是TnT、3-gram
隐马)、情感分析(官网木有介绍原理,但是指明购物类的评论的准确率较高,其实是因为它的语料库主要是购物方面的,可以自己构建相关领域语料库,替换原来的,准确率也挺不错的)、文本分类(原理是朴素贝叶斯)、转换拼音、繁体转简体、提取文本关键词(原理是TextRank)、提取摘要(原理是TextRank)、分割句子、文本相似(原理是BM25)【摘自CSDN】。在看此之前,建议先看一下官网,里面有最基础的一些命令的介绍。官网链接:https://pypi.org/project/snownlp/
由于snownlp全部是unicode编码,所以要注意数据是否为unicode编码。因为是unicode编码,所以不需要去除中文文本里面含有的英文,因为都会被转码成统一的编码上面只是调用snownlp原生语料库对文本进行分析,snownlp重点针对购物评价领域,所以为了提高情感分析的准确度可以采取训练语料库的方法。
attr, val = [], []info = count_sentiment(csv_file)info = sorted(info.items(), key=lambda x: x[0], reverse=False) # dict的排序方法for each in info[:-1]:attr.append(each[0])val.append(each[1])line = Line(csv_file+":影评情感分析")line.add("", attr, val, is_smooth=True, is_more_utils=True)line.render(csv_file+"_情感分析曲线图.html")
3 评论来源城市分析
调用pyecharts的page函数,可以在一个图像对象中创建多个 chart
,只需要对应的add即可。
geo1 = Geo("", "评论城市分布", title_pos="center", width=1200, height=600,background_color='#404a59', title_color="#fff")geo1.add("", attr, val, visual_range=[0, 300], visual_text_color="#fff", is_geo_effect_show=False,is_piecewise=True, visual_split_number=10, symbol_size=15, is_visualmap=True, is_more_utils=True)# geo1.render(csv_file + "_城市dotmap.html")page.add_chart(geo1)geo2 = Geo("", "评论来源热力图",title_pos="center", width=1200,height=600, background_color='#404a59', title_color="#fff",)geo2.add("", attr, val, type="heatmap", is_visualmap=True, visual_range=[0, 50],visual_text_color='#fff', is_more_utils=True)# geo2.render(csv_file+"_城市heatmap.html") # 取CSV文件名的前8位数page.add_chart(geo2)bar = Bar("", "评论来源排行", title_pos="center", width=1200, height=600 )bar.add("", attr, val, is_visualmap=True, visual_range=[0, 100], visual_text_color='#fff',mark_point=["average"],mark_line=["average"],is_more_utils=True, is_label_show=True, is_datazoom_show=True, xaxis_rotate=45)bar.render(csv_file+"_城市评论bar.html") # 取CSV文件名的前8位数page.add_chart(bar)pie = Pie("", "评论来源饼图", title_pos="right", width=1200, height=600)pie.add("", attr, val, radius=[20, 50], label_text_color=None, is_label_show=True, legend_orient='vertical', is_more_utils=True, legend_pos='left')pie.render(csv_file + "_城市评论Pie.html") # 取CSV文件名的前8位数page.add_chart(pie)page.render(csv_file + "_城市评论分析汇总.html")
4 影片情感分析
0.5以下为负面情绪,0.5以上为正面情绪。可以看到好评还是很不错的,至于豆瓣上一些看衰评论只是少数。
5 电影评分走势分析
读取csv文件,以dataframe(df)形式保存
遍历df行,保存到list
统计相同日期相同评分的个数
转换为df格式,设置列名
按日期排序
遍历新的df,每个日期的评分分为5种,因此需要插入补充缺失数值。
creat_df = pd.DataFrame(columns = ['score', 'date', 'votes']) # 创建空的dataframefor i in list(info_new['date']):location = info_new[(info_new.date==i)&(info_new.score=="力荐")].index.tolist()if location == []:creat_df.loc[mark] = ["力荐", i, 0]mark += 1location = info_new[(info_new.date==i)&(info_new.score=="推荐")].index.tolist()if location == []:creat_df.loc[mark] = ["推荐", i, 0]mark += 1location = info_new[(info_new.date==i)&(info_new.score=="还行")].index.tolist()if location == []:creat_df.loc[mark] = ["还行", i, 0]mark += 1location = info_new[(info_new.date==i)&(info_new.score=="较差")].index.tolist()if location == []:creat_df.loc[mark] = ["较差", i, 0]mark += 1location = info_new[(info_new.date==i)&(info_new.score=="很差")].index.tolist()if location == []:creat_df.loc[mark] = ["很差", i, 0]mark += 1info_new = info_new.append(creat_df.drop_duplicates(), ignore_index=True)
由于允许爬取的量少和时间问题,部分数据不是很明显。但依然可以得出一些发现。在影片上映开始的一周内,为评论高峰,尤其是上映3天内,这符合常识,但是也可能有偏差,因为爬虫获取的数据是经过豆瓣电影排序的,倘若数据量足够大得出的趋势可能更接近真实情况。
另外发现,影片在上映前也有部分评论,分析可能是影院公映前的小规模试映,且这些提前批的用户的评分均值,差不多接近影评上映后的大规模评论的最终评分
,从这些细节中,我们或许可以猜测,这些能提前观看影片的,可能是资深影迷或者影视从业人员,他们的评论有着十分不错的参考价值。
6 影评词云图
词云图制作时,先读取CSV文件一dataframe形式保存,去除评论中非中文文本,选了胡歌照片作为背景,并设置了停用词表。
wc = WordCloud(width=1024, height=768, background_color='white',mask=backgroud_Image, font_path="C:\simhei.ttf",stopwords=stopwords, max_font_size=400,random_state=50)
可以看到高频词“可以”表现出对该片的认可,“特效”体现出特效镜头对科幻片的重要性,“科幻电影”体现出影迷对科幻类电影的浓厚兴趣。
以上就是本次爬取豆瓣网《流浪地球》短评的过程与数据分析。
_**[ 微信公众号原文链接
](https://mp.weixin.qq.com/s?__biz=MzI1NzY0MTY3MA==&mid=2247483885&idx=1&sn=2141905cab6e279c2d9198b123ea02c9&chksm=ea151c44dd629552ce7a11351deb22b38b010c55c08f604f3733cad150a7122c5fc8a580470b&token=1955733606&lang=zh_CN#rd)
** _
微信公众号“ 学编程的金融客 ”后台回复“ 流浪地球 ”即可获得 源码 。
Python爬取《流浪地球》豆瓣影评与数据分析可视化相关推荐
- 我用Python爬取了豆瓣影评,成功后居然发现了一个惊人的秘密.........
大家好,我是IT界搬运喵. 相信大家在工作无聊时,总想掏出手机,看看电影刷刷视频.更加是夜深人静的时候,总是按耐不住自己的内心想要去看看小电影,当然我可没有开车.我说的是好电影,豆瓣高分电影,自己想歪 ...
- Python爬取、存储、分析、可视化豆瓣电影Top250
Python爬取.存储.分析.可视化豆瓣电影Top250 网站链接: https://movie.douban.com/top250 @文章目录 前言 一.python爬取目标数据,并写入csv文件 ...
- 爬取猫眼电影影评,数据可视化分析源代码运行说明
欢迎关注微信公众号:简说Python 账号:xksnh888 关注回复:1024,可以领取精选编程学习电子书籍. 爬取猫眼电影影评,数据可视化分析 项目地址 :github项目地址 之前一直有同学说不 ...
- python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评
使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...
- python爬取流浪地球_python爬取《流浪地球》获十几万评论点赞,超给力!
原标题:python爬取<流浪地球>获十几万评论点赞,超给力! 我自己到现在其实还没看这部电影,毕竟这电影这么火,电影院现在都很难买到好的位置.所以我打算不如先看看大家是怎么评价这部电影的 ...
- python怎么爬取知乎回答并制作词云_使用python爬取流浪地球影评并制作词云,看看别人都说了些说什么...
流浪地球影评爬取 大过年的,蹭个热度,看完电影后爬一下影评并作出词云. 本次影评取自豆瓣: https://movie.douban.com/subject/26266893/ 抓包 首先是拿到访问的 ...
- python爬取流浪地球_Scrapy爬取猫眼流浪地球影评2----- 获取数据
本帖最后由 py看考场 于 2019-3-25 20:16 编辑 上一篇帖子中介绍了scrapy的安装,以及scrapy的基本配置,本篇介绍流浪地球影评的获取. 上一篇帖子传输门scrapy的安装配置 ...
- python爬虫影评_Python爬虫-爬取杀破狼豆瓣影评并小作分析~
也是前几天看到一个公众号推了一篇文章,是爬取战狼的影评.今天自己也来试一下 我选择爬的是<杀破狼> image.png 然后就是打开短评页面,可以看到comment-item,这就是影评了 ...
- python爬取流浪地球_python爬取《流浪地球》十万个短评得出以下结论
作者: 小柒 爬取 逼乎上很多高手,对<流浪地球>在豆瓣的评分做了细思缜密的分析,有兴趣的也去自己搜索,这里主要是爬取<流浪地球>的好.中.差短评并分词分析. 爬取数据: im ...
最新文章
- 解决日常bug的正确姿势
- 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)
- 初级开发者vs高级开发者 | 每日趣闻
- CryEngine最新版发布,支持Vulkan API
- unity_简单五子棋的实现(无AI)
- C++11 新增关键字decltype学习
- html 中写样式,css样式中黑体怎么写
- cf两边黑屏怎么解决win10_win10开机无限黑屏转圈重启解决方法
- [四]RabbitMQ-客户端源码之Frame
- 推荐:全网最全的Java并发面试题及答案。
- devops实践指南_DevOps:掌握这些便捷指南
- 如鹏网学习笔记(十二)HTML5
- ad9生成坐标文件_提高效率 | 教你批量提取CAD坐标的小技巧
- python画图为什么运行不出来_PyCharm中Matplotlib绘图不能显示UI效果的问题解决
- 大数据入门介绍和学习路线
- python和r哪个好学知乎_r语言和python学哪个?
- 如何用c语言实现猜数字游戏?
- U盘快捷方程病毒 iexplore.vbs
- discuz全局数组变量 后台各项设置 完整版
- C++综合练习——身份证
热门文章
- 19numpy.log 和numpy.log10的区别
- 【每日一练】03—实现动画循环进度
- 3.25 实战智能合约众筹1
- 怎样测量地图上曲线的长度_长度测量的五种方法
- js、jq遍历数组和对象
- 护考人机对话用计算机吗,2017年护考改革 人机对话,有什么要注意的?
- @RequestParam和@RequestBody的使用
- java排列组合问题汇总【经典】
- 警告: Exception encountered during context initialization - cancelling refresh attempt
- threshold计算机英语,计算机专业英语