转载自公众号:python-china
作者想学习知识图谱,奈何没有数据,只能自己找。于是选择了豆瓣电影。网址:
https://movie.douban.com/top250?start=0&filter=
image
一、分析问题
豆瓣电影Top250主页面看着信息比较完整,仔细看会发现主演内容不全,查看网页源代码
image直接爬取主页面,主演内容会获取不全。于是想到进入每个电影的详细页面进行爬取,打开第一个电影,可以看到如下。
image信息比较全,所以决定数据从电影详细页爬取。
构建知识图谱首先选择所要存储的字段。经过考虑和大家的兴趣,主要探索导演、演员、电影的关系,再加上电影类型。所以确定所要爬取的字段为
-
电影名称
-
导演
-
演员
-
电影类型
本文的操作过程步骤如下:
第一步:从主页爬取到每个电影详细页的地址,进行存储
第二步:读取第一步中电影地址列表,依次爬取每个电影的信息,进行存储
第三步:对爬取的电影数据提取整合出知识图谱的结点和关系
结点:
-
电影结点(电影ID,电影名称,标签)
-
导演结点(导演ID,导演名称,标签)
-
演员结点(演员ID,演员名称,标签)
-
类型结点(类型ID,类型名称,标签)
关系:
-
导演——电影关系(导演)
-
演员——电影关系(出演)
-
导演——演员关系(合作)
-
电影——类型关系(属于)
第四步:将结点和关系导入Neo4j,生成图谱
二、爬取数据
一开始用的Scrapy框架爬取,获取电影URL比较简单,获取到的URL为下面样式:
image下面对电影详细页进行爬取。
一开始继续使用scrapy,弄了半天,发现电影、导演、类型都爬下来了,可是演员怎么都获取不到。后来才注意到演员是JS动态生成的,真是浪费感情了。于是使用requests+BeautifulSoup来爬取数据。
代码如下:
读取详细页URL列表
image遍历URL列表,爬取每个页面信息,将每个页面的信息存储在results列表
image将爬取结果导出到CSV文件
image导出的文件如下:
image三、生成结点和关系
数据有了,下一步就是整理出所需要的可以直接导入到Neo4j的结点和关系文件。
结点:
-
电影结点(电影ID,电影名称,标签)
-
导演结点(导演ID,导演名称,标签)
-
演员结点(演员ID,演员名称,标签)
-
类型结点(类型ID,类型名称,标签)
提取结点的主要代码如下:
下面主要获得电影、导演、演员、类型的集合,方便ID编码
image下面生成电影、导演、演员、类型的ID
image拼接结点数据
image生成结点文件
image关系:
-
导演——电影关系(导演)
-
演员——电影关系(出演)
-
导演——演员关系(合作)
-
电影——类型关系(属于)
读取以上生成的结点文件
image遍历文件,拼接出关系表,主要代码如下:
image导出到CSV
image这样所需要的结点和关系文件就生成好了
imagedirector.csv文件格式如下:
imagerelationship_director_film.csv文件格式如下:
image四、导入Neo4j,生成图谱
使用如下语句导入
image.gif需要注意的是,这种导入方式需要保证你的数据库中没有movie.db,否则会报错。因为Neo4j默认的数据库为graph.db,所以导入成功后,需要修改neo4j.conf文件,才能查看刚才生成的数据库。修改如下:
image重新启动Neo4j后,你就会看到你的数据了。
我们来查看一下效果。
网友评论