1.前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取

Python免费学习资料、代码以及交流解答点击即可加入


看电影前很多人都喜欢去『豆瓣』看影评,所以我爬取44130条『豆瓣』的用户观影数据,分析用户之间的关系,电影之间的联系,以及用户和电影之间的隐藏关系。

2.爬取观影数据

数据来源


https://movie.douban.com/

在『豆瓣』平台爬取用户观影数据。

爬取用户列表

网页分析

为了获取用户,我选择了其中一部电影的影评,这样可以根据评论的用户去获取其用户名称(后面爬取用户观影记录只需要『用户名称』)。

https://movie.douban.com/subject/24733428/reviews?start=0

url中start参数是页数(page*20,每一页20条数据),因此start=0、20、40...,也就是20的倍数,通过改变start参数值就可以获取这4614条用户的名称。

查看网页的标签,可以找到『用户名称』值对应的标签属性。

编程实现


i=0
url = "https://movie.douban.com/subject/24733428/reviews?start=" + str(i * 20)
r = requests.get(url, headers=headers)
r.encoding = 'utf8'
s = (r.content)
selector = etree.HTML(s)for item in selector.xpath('//*[@class="review-list  "]/div'):userid = (item.xpath('.//*[@class="main-hd"]/a[2]/@href'))[0].replace("https://www.douban.com/people/","").replace("/", "")username = (item.xpath('.//*[@class="main-hd"]/a[2]/text()'))[0]print(userid)print(username)print("-----")

爬取用户的观影记录

上一步爬取到『用户名称』,接着爬取用户观影记录需要用到『用户名称』。

网页分析


#https://movie.douban.com/people/{用户名称}/collect?start=15&sort=time&rating=all&filter=all&mode=grid
https://movie.douban.com/people/mumudancing/collect?start=15&sort=time&rating=all&filter=all&mode=grid

通过改变『用户名称』,可以获取到不同用户的观影记录。

url中start参数是页数(page*15,每一页15条数据),因此start=0、15、30...,也就是15的倍数,通过改变start参数值就可以获取这1768条观影记录称。

查看网页的标签,可以找到『电影名』值对应的标签属性。

编程实现


url = "https://movie.douban.com/people/mumudancing/collect?start=15&sort=time&rating=all&filter=all&mode=grid"
r = requests.get(url, headers=headers)
r.encoding = 'utf8'
s = (r.content)
selector = etree.HTML(s)for item in selector.xpath('//*[@class="grid-view"]/div[@class="item"]'):text1 = item.xpath('.//*[@class="title"]/a/em/text()')text2 = item.xpath('.//*[@class="title"]/a/text()')text1 = (text1[0]).replace(" ", "")text2 = (text2[1]).replace(" ", "").replace("\n", "")print(text1+text1)print("-----")

保存到excel

定义表头


# 初始化execl表
def initexcel(filename):# 创建一个workbook 设置编码workbook = xlwt.Workbook(encoding='utf-8')# 创建一个worksheetworksheet = workbook.add_sheet('sheet1')workbook.save(str(filename)+'.xls')##写入表头value1 = [["用户", "影评"]]book_name_xls = str(filename)+'.xls'write_excel_xls_append(book_name_xls, value1)

excel表有两个标题(用户, 影评)

写入excel


# 写入execl
def write_excel_xls_append(path, value):index = len(value)  # 获取需要写入数据的行数workbook = xlrd.open_workbook(path)  # 打开工作簿sheets = workbook.sheet_names()  # 获取工作簿中的所有表格worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格for i in range(0, index):for j in range(0, len(value[i])):new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入new_workbook.save(path)  # 保存工作簿

定义了写入excel函数,这样爬起每一页数据时候调用写入函数将数据保存到excel中。

最后采集了44130条数据(原本是4614个用户,每个用户大约有500~1000条数据,预计400万条数据)。但是为了演示分析过程,只爬取每一个用户的前30条观影记录(因为前30条是最新的)。

3.数据分析挖掘

读取数据集


def read_excel():# 打开workbookdata = xlrd.open_workbook('豆瓣.xls')# 获取sheet页table = data.sheet_by_name('sheet1')# 已有内容的行数和列数nrows = table.nrowsdatalist=[]for row in range(nrows):temp_list = table.row_values(row)if temp_list[0] != "用户" and temp_list[1] != "影评":data = []data.append([str(temp_list[0]), str(temp_list[1])])datalist.append(data)return datalist

从豆瓣.xls中读取全部数据放到datalist集合中。

分析1:电影观看次数排行


###分析1:电影观看次数排行
def analysis1():dict ={}###从excel读取数据movie_data = read_excel()for i in range(0, len(movie_data)):key = str(movie_data[i][0][1])try:dict[key] = dict[key] +1except:dict[key]=1###从小到大排序dict = sorted(dict.items(), key=lambda kv: (kv[1], kv[0]))name=[]num=[]for i in range(len(dict)-1,len(dict)-16,-1):print(dict[i])name.append(((dict[i][0]).split("/"))[0])num.append(dict[i][1])plt.figure(figsize=(16, 9))plt.title('电影观看次数排行(高->低)')plt.bar(name, num, facecolor='lightskyblue', edgecolor='white')plt.savefig('电影观看次数排行.png')

分析

1.由于用户信息来源于『心灵奇旅』评论,因此其用户观看量最大。
2.最近的热播电影中,播放量排在第二的是『送你一朵小红花』,信条和拆弹专家2也紧跟其后。

分析2:用户画像(用户观影相同率最高)


###分析2:用户画像(用户观影相同率最高)
def analysis2():dict = {}###从excel读取数据movie_data = read_excel()userlist=[]for i in range(0, len(movie_data)):user = str(movie_data[i][0][0])moive = (str(movie_data[i][0][1]).split("/"))[0]#print(user)#print(moive)try:dict[user] = dict[user]+","+str(moive)except:dict[user] =str(moive)userlist.append(user)num_dict={}# 待画像用户(取第一个)flag_user=userlist[0]movies = (dict[flag_user]).split(",")for i in range(0,len(userlist)):#判断是否是待画像用户if flag_user != userlist[i]:num_dict[userlist[i]]=0#待画像用户的所有电影for j in range(0,len(movies)):#判断当前用户与待画像用户共同电影个数if movies[j] in dict[userlist[i]]:# 相同加1num_dict[userlist[i]] = num_dict[userlist[i]]+1###从小到大排序num_dict = sorted(num_dict.items(), key=lambda kv: (kv[1], kv[0]))#用户名称username = []#观看相同电影次数num = []for i in range(len(num_dict) - 1, len(num_dict) - 9, -1):username.append(num_dict[i][0])num.append(num_dict[i][1])plt.figure(figsize=(25, 9))plt.title('用户画像(用户观影相同率最高)')plt.scatter(username, num, color='r')plt.plot(username, num)plt.savefig('用户画像(用户观影相同率最高).png')

分析

以用户『mumudancing』为例进行用户画像
1.从图中可以看出,与用户『mumudancing』观影相同率最高的是:“请带我回布拉格”,其次是“李校尉”。
2.用户:'绝命纸牌', '笨小孩', '私享史', '温衡', '沈唐', '修左',的观影相同率相同。

分析3:用户之间进行电影推荐


###分析3:用户之间进行电影推荐(与其他用户同时被观看过)
def analysis3():dict = {}###从excel读取数据movie_data = read_excel()userlist=[]for i in range(0, len(movie_data)):user = str(movie_data[i][0][0])moive = (str(movie_data[i][0][1]).split("/"))[0]#print(user)#print(moive)try:dict[user] = dict[user]+","+str(moive)except:dict[user] =str(moive)userlist.append(user)num_dict={}# 待画像用户(取第2个)flag_user=userlist[0]print(flag_user)movies = (dict[flag_user]).split(",")for i in range(0,len(userlist)):#判断是否是待画像用户if flag_user != userlist[i]:num_dict[userlist[i]]=0#待画像用户的所有电影for j in range(0,len(movies)):#判断当前用户与待画像用户共同电影个数if movies[j] in dict[userlist[i]]:# 相同加1num_dict[userlist[i]] = num_dict[userlist[i]]+1###从小到大排序num_dict = sorted(num_dict.items(), key=lambda kv: (kv[1], kv[0]))# 去重(用户与观影率最高的用户两者之间重复的电影去掉)user_movies = dict[flag_user]new_movies = dict[num_dict[len(num_dict)-1][0]].split(",")for i in range(0,len(new_movies)):if new_movies[i] not in user_movies:print("给用户("+str(flag_user)+")推荐电影:"+str(new_movies[i]))

分析

以用户『mumudancing』为例,对用户之间进行电影推荐
1.根据与用户『mumudancing』观影率最高的用户(A)进行进行关联,然后获取用户(A)的全部观影记录
2.将用户(A)的观影记录推荐给用户『mumudancing』(去掉两者之间重复的电影)。

分析4:电影之间进行电影推荐


###分析4:电影之间进行电影推荐(与其他电影同时被观看过)
def analysis4():dict = {}###从excel读取数据movie_data = read_excel()userlist=[]for i in range(0, len(movie_data)):user = str(movie_data[i][0][0])moive = (str(movie_data[i][0][1]).split("/"))[0]try:dict[user] = dict[user]+","+str(moive)except:dict[user] =str(moive)userlist.append(user)movie_list=[]# 待获取推荐的电影flag_movie = "送你一朵小红花"for i in range(0,len(userlist)):if flag_movie in dict[userlist[i]]:moives = dict[userlist[i]].split(",")for j in range(0,len(moives)):if moives[j] != flag_movie:movie_list.append(moives[j])data_dict = {}for key in movie_list:data_dict[key] = data_dict.get(key, 0) + 1###从小到大排序data_dict = sorted(data_dict.items(), key=lambda kv: (kv[1], kv[0]))for i in range(len(data_dict) - 1, len(data_dict) -16, -1):print("根据电影"+str(flag_movie)+"]推荐:"+str(data_dict[i][0]))

分析

以电影『送你一朵小红花』为例,对电影之间进行电影推荐
1.获取观看过『送你一朵小红花』的所有用户,接着获取这些用户各自的观影记录。
2.将这些观影记录进行统计汇总(去掉“送你一朵小红花”),然后进行从高到低进行排序,最后可以获取到与电影『送你一朵小红花』关联度最高排序的集合。
3.将关联度最高的前15部电影给用户推荐。

4.总结

1.分析爬取豆瓣平台数据思路,并编程实现。
2.对爬取的数据进行分析(电影观看次数排行、用户画像、用户之间进行电影推荐、电影之间进行电影推荐)

Python爬取44130条用户观影数据,分析挖掘用户与电影之间的隐藏信息!相关推荐

  1. python爬取电脑本地数据_利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息...

    原标题:利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息 新型肺炎肆虐全国,可以预知,最近一两年地理学中会有一部分论文研究新型肺炎的空间分布及与其他指标的关联分析.获取其患病人 ...

  2. 利用python爬取丁香医生上新型肺炎数据,并下载到本地,附带经纬度信息

    新增:国外疫情网站介绍 已更新:爬取国外疫情数据 已更新:新型肺炎历史数据下载 2020年3月27日补充: 制作了一个全球肺炎数据查询下载网站,效果如下: 访问地址:http://119.3.227. ...

  3. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?

    作者 | 朱小五 责编 | 屠敏 封图 | CSDN 付费下载自东方 IC 最近又火了一部国产剧:<隐秘的角落>. 如果你没看过,那可能会对朋友圈里大家说的"一起去爬山" ...

  4. Python 爬取 201865 条《隐秘的角落》弹幕数据,发现看剧不如爬山?

    Python 爬取 201865 条<隐秘的角落>弹幕数据,发现看剧不如爬山? 本文不涉及剧透!请放心食用 最近又火了一步国产剧:<隐秘的角落> 如果你没看过,那可能会对朋友圈 ...

  5. 用 Python 爬取 4332 条数据,揭秘甜咸肉粽的江湖!

    作者 | 朱小五 责编 | 屠敏 来源 | 凹凸数据 端午节快要到了,甜咸粽子之争也快要拉开帷幕. 本文准备用Python爬取淘宝上的粽子数据并进行分析,看看有什么发现. 注:本文仅用于学习交流,禁止 ...

  6. python爬取知乎回答并进行舆情分析:爬取数据部分

    python爬取知乎回答并进行舆情分析:爬取数据部分 背景 Ajax原理介绍 Request URL分析 json报文结构分析 代码 参考链接 背景 近期导师让我从社交媒体平台(包括微博.知乎.贴吧等 ...

  7. python爬取微博评论(无重复数据)

    python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址2.解析页面中的微博地址3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论2.获 ...

  8. 对数据集“Netflix电影电视剧及用户观影数据“的分析处理和可视化

    对数据集"Netflix电影电视剧及用户观影数据"的分析处理和可视化 一.寻找数据集 from kaggle:<Netflix Movies and TV Shows> ...

  9. python爬取豆瓣读书并进行图形化分析

    python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...

最新文章

  1. 吴文俊AI最高成就奖颁给清华张钹院士,之前曾空缺七年
  2. 系统进入低功耗的配置
  3. CentOS学习笔记--程序管理
  4. 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制
  5. AngularJs的基础——$http请求数据
  6. MySQL的Binlog与Redolog
  7. org.apache.commons.io.IOUtils 的用法(神器,再也不用写冗余代码了)
  8. 汽车CAN总线关闭故障的诊断与恢复
  9. php劳务派遣系统,劳务派遣系统搭建
  10. 想给我们的线下分享会起个名字,求建议!
  11. win7触摸板怎么关闭_笔记本fn键失灵怎么办?
  12. po,bo,vo,pojo,dto的区别
  13. 多线程编译与运行linux,Linux系统下多线程程序编译makefile文件
  14. 电脑视频转换成mp4格式,视频格式转换器转换
  15. qiao-get-ip:免费获取公网ip
  16. 寻票软件医院挂号攻略
  17. 纯C语言实现贪吃蛇游戏(VC6.0)
  18. VRTK插件详解四:部分自带案例分析
  19. 整车OTA被“双规”
  20. latex参考文献居中_LaTeX中参考文献管理以及注意事项

热门文章

  1. 小程序代码超出2M怎么办?如何使用分包加载?
  2. 基于云平台的物联网架构和原理
  3. 第1关:编写函数在结构体数组中查找数组元素
  4. 人工智能Java SDK:语音识别(ASR)【长语音】
  5. python人工智能课程实例_python人工智能AI深度学习/机器学习全套课程 视频教程+ppt+代码...
  6. mysql 查询今天_mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句
  7. 计算机硬件甩,计算机硬件 篇一:手把手教你更新CPU微码-x99平台最后的挣扎
  8. 让Apache Shiro保护你的应用
  9. 受限玻尔兹曼机的基础知识二
  10. 必备 免费人物虚幻模型素材网站