Neo4j入门之中国电影票房排行浅析
什么是Neo4j?

Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
作为图形数据库,Neo4j最让人惊喜的功能就是它可以直观地展示图,也就是节点与节点之间的关系,当然,它还有其它的优势,比如:
- 很容易表示连接的数据;
- 检索/遍历/导航更多的连接数据是非常容易和快速的;
- 能轻松地表示半结构化数据;
- Neo4j CQL查询语言命令类似于SQL,可读性好,容易学习;
- 使用简单而强大的数据模型;
- 不需要复杂的连接来检索连接的/相关的数据。
在本文中,笔者希望能够通过一个简单的例子来展示Neo4j的使用以及它的强大之处,这无疑更适合于初学者,因为笔者也是刚入门。
以下,笔者并不会过多地介绍Neo4j的操作,只是希望读者能对Neo4j的功能有直观的感受,至于教程之类的,可以参考文章最后的参考文献。
下面,让我们进入本次的Neo4j之旅~
项目展示
由于《流浪地球》的大热以及笔者对此的欣赏,因此,此次的项目为分析中国电影票房排行。我们的数据来自于百度百科,用爬虫得到我们需要的数据,主要是电影的相关信息,如排名,票房,上映日期等,以及电影的主演。将数据储存为CSV文件,并导入至Neo4j,最后得到电影的简单分析及可视化。
整个项目主要是以下三步:
- 数据获取:利用爬虫实现;
- 数据导入:利用Py2neo实现;
- 数据展示:利用Neo4j实现。
其中,Py2neo为Neo4j的Python接口。
整个项目的结构如下图:

接下来,笔者将详细地介绍每一步的操作及代码,let's go ~
数据获取
数据的获取始终是一个重要的问题,好在我们有爬虫这个工具。为了能够展示中国电影票房排行中的电影信息以及演员与电影的关系,首先的重要一步就是获取我们需要的需要。
我们需要两份数据。第一份数据,就是中国电影票房排行数据,网址为:https://baike.baidu.com/item/中国电影票房/4101787?fr=aladdin,页面如下:

我们制作爬虫,将这个表格爬取下来,并将表格的第一行(字段名称)作为电影的相关信息,然后储存为movies.csv。整个过程的Python代码(movie.py)如下:(因为这是公开数据,这个爬虫是合理的。)
# -*- coding: utf-8 -*-
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = "https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF/4101787"
# 请求头部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text.encode('ISO-8859-1'),'lxml')
table = soup.find('table')('tr')
movies = []
for line in table[1:]:
movie = {'rank': int(line('td')[0].text),
'src': line('td')[1]('a')[0]['href'],
'name': line('td')[1].text,
'box_office': line('td')[2].text,
'avg_price': int(line('td')[3].text),
'avg_people': int(line('td')[4].text),
'begin_date': line('td')[5].text.strip(),
}
# print(movie)
movies.append(movie)
# print(movies)
df = pd.DataFrame({'rank': [movie['rank'] for movie in movies],
'src': [movie['src'] for movie in movies],
'name': [movie['name'] for movie in movies],
'box_office': [movie['box_office'] for movie in movies],
'avg_price': [movie['avg_price'] for movie in movies],
'avg_people': [movie['avg_people'] for movie in movies],
'begin_date': [movie['begin_date'] for movie in movies]
})
# print(df.head())
df.to_csv(r'./movies.csv', index=False)
movies.csv中的数据如下:

OK,第二份数据,每部电影(共20部)的主演,以《流浪地球》为例,网址为:https://baike.baidu.com/item/流浪地球/16278407,页面如下:

我们只需要爬取每部电影的主演就够了,也就是上图中的红色部分,实现的Python代码(actor.py)如下:
# -*- coding: utf-8 -*-
import requests
import pandas as pd
from bs4 import BeautifulSoup
def get_actors(src):
url = "https://baike.baidu.com"+src
# 请求头部
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text.encode('ISO-8859-1'),'lxml')
names = soup.find_all('dt', class_="basicInfo-item name")
values = soup.find_all('dd', class_="basicInfo-item value")
actors = []
for name, value in zip(names, values):
# print(name.text)
if '主' in name.text and '演' in name.text:
# print(name.text.replace(' ', ''), value.text)
actors = value.text.strip().split(',')
actors = [actor.strip().replace('\xa0', '').replace('\n[6]', '') for actor in actors if actor]
# print(actors)
return ','.join(actors)
df = pd.read_csv('./movies.csv')
actors_list = []
for name, src in zip(list(df['name']), list(df['src'])):
actors = get_actors(src)
# print(name, actors)
actors_list.append(actors)
new_df = pd.DataFrame({'actors': actors_list})
new_df['name'] = df['name']
# print(new_df)
new_df.to_csv(r'./actors.csv', index=False)
生成的actor.csv数据如下:

OK,数据收集的任务就到此完成了,有了爬虫,轻松搞定数据难题。
导入数据
接着,我们需要用到刚才储存的movies.csv和actor.csv,利用Py2neo来将数据导入至Neo4j中。
首先,需要确保你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,具体的安装流程可参考网址:https://www.w3cschool.cn/neo4j/neo4j_features_advantages.html 。
利用Py2neo,我们就可以用Python轻松地实现将数据导入至Neo4j,实现的功能为:创建电影节点以及演员节点,并创建两者之间的关系,关系名称为“ACT_IN”。实现的Python代码()如下:
# -*- coding: utf-8 -*-
import pandas as pd
from py2neo import Graph, Node, Relationship, NodeMatcher
# 读取csv文件
movies_df = pd.read_csv(r'./movies.csv')
actors_df = pd.read_csv(r'./actors.csv')
# 连接Neo4j服务
graph = Graph(host="localhost://7474", auth=("neo4j", "jc147369"))
# 创建电影节
for i in range(movies_df.shape[0]):
rank = str(movies_df.iloc[i, :]['rank'])
name = movies_df.iloc[i, :]['name']
box_office = movies_df.iloc[i, :]['box_office']
avg_price = str(movies_df.iloc[i, :]['avg_price'])
avg_people = str(movies_df.iloc[i, :]['avg_people'])
begin_date = movies_df.iloc[i, :]['begin_date']
node = Node("Movie",
name=name,
rank=rank,
box_office=box_office,
avg_price=avg_price,
avg_people=avg_people,
begin_date=begin_date
)
# print(movies_df.iloc[i, :]['rank'])
graph.create(node)
print('create movie nodes successfully!')
# 创建演员节点
all_actors = set()
for i in range(actors_df.shape[0]):
actor_list = actors_df.iloc[i, :]['actors'].split(',')
for actor in actor_list:
all_actors.add(actor)
for actor in all_actors:
node = Node("Actor", name=actor)
graph.create(node)
print('create actor nodes successfully!')
# 创建演员——电影关系
for i in range(actors_df.shape[0]):
name = actors_df.iloc[i, :]['name']
matcher = NodeMatcher(graph)
movie_node = matcher.match("Movie", name=name).first()
actors = actors_df.iloc[i, :]['actors'].split(',')
# print(name, actors)
for actor in actors:
actor_node = matcher.match("Actor", name=actor).first()
relationship = Relationship(actor_node, 'ACT_IN', movie_node)
graph.create(relationship)
print('create relationships successfully!')
print('You can check Neo4j now!')
只要你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,不出意外,那么你的Neo4j已经默默地储存了这些数据,而它们将会给出带来巨大的惊喜:天呐,这竟然是个数据库!
在浏览器中输入“localhost:7474”,并点击左上方的数据库图标,就能看到下图:

可以看到,在Neo4j中,我们创建了142个节点,分为两类:Movie和Actor,以及136对关系,关系名称为ACT_IN. 当然,这些都是枯燥的,那么我们来看看数据展示这步吧,它会给我们带来什么惊喜?
数据展示
好不容易到了数据展示这一步,之前的努力都不会白费!
在Neo4j的前端页面(也就是网址:http://localhost:7474)中的命令行中输入命令:
MATCH (Movie)
RETURN (Movie);
运行命令后,很快就能得到整个图(包含电影节点、演员节点以及关系)的可视化展示,由于图像过大,不能看清细节,因此,就局部放大来看,同时得到一些简单的分析。
首先是图一,吴京主演的电影。

在中国电影票房排行榜的前20名中,吴京主演了《战狼2》与《流浪地球》,且两者没有其他更多的相同主演。
接着是图二,沈腾主演的电影。

在中国电影票房排行榜的前20名中,沈腾主演了《西虹市首富》、《疯狂的外星人》以及《羞羞的铁拳》,这显示了沈腾的票房号召力(他也是笔者喜欢的喜剧演员),不过开心麻花团队的其他成员在这三部电影的拍摄中应该见不到面。
接着是图三,《捉妖记》及《捉妖记2》。

捉妖记系列电影无疑是成功的,两部电影都进了票房的前20,他们的共同主演就多了,有曾志伟,吴君如,井柏然,白百何。
接着是图四,主要是看看Neo4j帮我们挖掘了哪些潜在的关系。

从《唐人街探案2》到《捉妖记2》,这个不算长的链条给了我们一些惊喜,原来,刘昊然可以通过尚语贤再通过曾志伟认识李宇春,一个very interesting的分析。当然,这个是笔者的分析,他俩到底认不认识笔者是不知道滴~
分析到此结束,如果读者想看原图,可以参看该项目的github地址:https://github.com/percent4/Neo4j_movie_demo 。
总结
感谢读者不厌其烦地看到了这里,看完了这篇“又臭又长”的文章,好在图比较多,应该能稍微减轻点阅读的压力。
再说说该项目的不足之处:那就是Neo4j的操作语法展示的比较少,约等于没有,这主要是笔者也是初入门,不熟。如果后续对Neo4j的操作语法CQL熟练了,我们就能能到更多有趣的结果,而不是这么一句简单的分析(有敷衍的嫌疑)。
最后,对此项目感兴趣的读者,可以移步该项目的github地址:https://github.com/percent4/Neo4j_movie_demo 。
注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注~
参考文献
- Neo4j_百度百科:https://baike.baidu.com/item/Neo4j/9952114?fr=aladdin
- neo4j教程:https://www.w3cschool.cn/neo4j/neo4j_features_advantages.html
- The Py2neo v3 Handbook: https://py2neo.org/v3/index.html
- Neo4j简介及Py2Neo的用法: https://cuiqingcai.com/4778.html
Neo4j入门之中国电影票房排行浅析的更多相关文章
- ActiveReports 大数据分析报告:2018中国电影再次迎来黄金时代
回顾2018,中国电影市场收获颇丰.先是凭借春节档<红海行动>.<唐人街探案>双双实现30亿票房突破,而后暑期档火力全开,<我不是药神>.<西虹市首富> ...
- VR电影这一新概念在中国电影道路上的探索
在12月的一个下午,Kevin Geiger正在进行关于VR中的故事讲述的一次再普通不过的演讲.地点是北京电影学院里一个围的水泄不通的场馆,他鼓励大家都来参与电影制作,无论是导演.演员还是电影行业的任 ...
- kaggle——TMDB 电影票房收入预测
介绍 看电影是目前人们休闲娱乐,消遣时光的选择之一.我们都知道,有些电影的票房很高,有的电影票房却很低,那么决定票房的因素是什么呢?本次将介绍,如何根据电影上映前的一些信息来预测出该电影的票房. 知识 ...
- python实现的、带GUI界面电影票房数据可视化程序
代码地址如下:http://www.demodashi.com/demo/14588.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采 ...
- python实现的电影票房数据可视化
代码地址如下:http://www.demodashi.com/demo/14275.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采 ...
- 【python数据分析实战】电影票房数据分析(一)数据采集
目录 1.获取url 2.开始采集 3.存入mysql 本文是爬虫及可视化的练习项目,目标是爬取猫眼票房的全部数据并做可视化分析. 1.获取url 我们先打开猫眼票房http://piaofang.m ...
- 【python数据分析实战】电影票房数据分析(二)数据可视化
目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...
- python网络爬虫(11)近期电影票房或热度信息爬取
目标意义 为了理解动态网站中一些数据如何获取,做一个简单的分析. 说明 思路,原始代码来源于:https://book.douban.com/subject/27061630/. 构造-下载器 构造分 ...
- Python学习 —— 爬虫入门 - 爬取Pixiv每日排行中的图片
更新于 2019-01-30 16:30:55 我另外写了一个面向 pixiv 的库:pixiver 支持通过作品 ID 获取相关信息.下载等,支持通过日期浏览各种排行榜(包括R-18),支持通过 p ...
随机推荐
- 浅析ajax原理与用法
1 ajax原理 Ajax(Asynchronous JavaScript and XML (异步的JavaScript和XML)),是一种快速创建 动态网页的技术,目的是显示动态局部刷新.通过XML ...
- sudo apt-get update: 0% [正在等待报头]
问题描述:使用apt-get下载一个文件,由于下载的太慢,使用Ctrl+C强制结束.然后输入sudo apt-get update,想继续下载其他文件.结果出现如标题所示的错误,截图如下:按照网上说的 ...
- MySQL 中基于 XA 实现的分布式事务
1 XA协议 首先我们来简要看下分布式事务处理的XA规范可知XA规范中分布式事务有AP,RM,TM组成: 其中应用程序(Application Program ,简称AP):AP定义事务边界(定义事务 ...
- C#爬虫使用代理刷csdn文章浏览量
昨天写了一篇关于“c#批量抓取免费代理并验证有效性”的文章,接着昨天的目标继续完成吧,最终实现的目的就是刷新csdn文章的浏览量(实际上很简单,之前博客园的文章也是可以使用代理ip来刷的,后来不行了) ...
- 很详细的Django入门详解
Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...
- 深度学习与计算机视觉:基于Python的神经网络的实现
在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...
- 使用JavaScript和D3.js实现数据可视化
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由独木桥先生发表于云+社区专栏 介绍 D3.js是一个JavaScript库.它的全称是Data-Driven Documents(数据 ...
- 补习系列(16)-springboot mongodb 数据库应用技巧
目录 一.关于 MongoDB 二.Spring-Data-Mongo 三.整合 MongoDB CRUD A. 引入框架 B. 数据库配置 C. 数据模型 D. 数据操作 E. 自定义操作 四.高级 ...
- Quartz.Net学习笔记
一.概述 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中.它灵 ...
- 如何在新工程中添加两个不同版本的的echarts库
emmmmm.....标题我就觉得起的很变态.闲话不多说,先说出现的背景吧--. 因为业务上的需求,跟一个硬件对接,要做大屏展示大厅客流热力图分布(背景图是客户那边给的).然后这个机子传过来的数据就可 ...