近期学习Neo4j,以豆瓣top250数据为研究对象,实现python在线爬取数据写入Neo4j创建知识图谱,下文详细介绍步骤。

1、知识图谱设计

通过分析网页,爬取网页可以得到movie、country、type、time、director、actor、score等信息,此处我将movie、country、type、time、director、actor作为节点,而score作为movie的属性,网上有很多地方讲到只将movie、director、actor作为节点,其余均作为movie的属性,这个我之前也做过,但最后的效果并不是我想要的,至于什么效果,后文会提到。节点和关系设计如下图。

2、爬取数据并写入Neo4j

此处就直接上代码了:

from bs4 import BeautifulSoup
from urllib.request import urlopen,urlparse,urlsplit,Request
import urllib.request
import re
import codecs
import random
import py2neo
from py2neo import Graph
#
ua_list = ["Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",#Chrome"Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0",#firwfox"Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",#IE"Opera/9.99 (Windows NT 5.1; U; zh-CN) Presto/9.9.9",#Opera
]if __name__ == "__main__":# connect to graphgraph = Graph ("http://localhost:11010/",username="admin",password="password")for i in range(0,9):ua = random.choice( ua_list )url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='req = urllib.request.Request( url, headers={'User-agent' : ua} )html=urlopen(req).read()soup = BeautifulSoup ( html, 'lxml' )page=soup.find_all('div', {'class' : 'item'})punc = ':· - ...:-'list_item=[]for item in page:content = {}try :text0=item.find ( 'p', {'class' : ""} ).text.strip ( ).split ( '\n' )[0]text1=item.find ( 'p', {'class' : ""} ).text.strip ( ).split ( '\n' ) [1]#get filmfilm=item.find( 'span', {'class' : 'title'} ).text.strip ( )film=re.sub ( r"[%s]+" % punc, "", film.strip ( ) )# get scorescore=item.find ( 'span', {'class' : 'rating_num'} ).text.strip ( )graph.run ("CREATE (movie:Movie {name:'" + film + "', score:'" + score +"'})" )#get directordirectors=text0.strip().split('   ')[0].strip().split(':')[1]directors = re.sub ( r"[%s]+" % punc, "", directors.strip ( ) )#存在特殊字符需要先去除# director=directors.split ( '/' )if len ( directors.split ( '/' ))>1:print(film+'has more than one director')#创建director节点if directors not in list_item:graph.run ("CREATE (director:Person {name:'" + directors + "'})" )list_item.append ( directors )#创建director-movie关系graph.run ("match (p:Person{name:'" + directors + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (p)-[:directed]->(b)" )#get actoractors = text0.strip ( ).split ( '   ' ) [1].strip ( ).split ( ':' ) [1]actors = re.sub ( r"[%s]+" % punc, "", actors.strip ( ) )#存在特殊字符需要先去除if len ( actors.split ( '/' ) ) == 1 :actor = actorsif actor not in list_item:graph.run ("CREATE (actor:Person {name:'" + actor + "'})" )list_item.append ( actor )graph.run ("match (p:Person{name:'" + actor + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (p)-[:acted_in]->(b)" )else :actor = actors.split ( '/' )if '...' in actor:actor.remove ( '...' )for i in range(len(actor)-1):if actor[i] not in list_item :graph.run ("CREATE (actor:Person {name:'" + actor [i] + "'})" )list_item.append ( actor [i] )graph.run ("match (p:Person{name:'" + actor[i] + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (p)-[:acted_in]->(b)" )#get timetime=text1.strip ( ).split ( '/' ) [0].strip()if time not in list_item:graph.run ("CREATE (time:Time {year:'" + time + "'})" )list_item.append ( time )graph.run ("match (p:Time{year:'" + time + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (b)-[:created_in]->(p)" )#get country#maybe more than onecountry=text1.strip ( ).split ( '/' ) [1].strip().split(' ')[0]if country not in list_item:graph.run ("CREATE (country:Country {name:'" + country + "'})" )list_item.append ( country )graph.run ("match (p:Country {name:'" + country + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (b)-[:produced_by]->(p)" )#get typetypes=text1.strip ( ).split ( '/' ) [2].strip().split(' ')if len(types)==1:type = typesif type not in list_item:graph.run ("CREATE (type:Type {name:'" + type + "'})" )list_item.append ( type )graph.run ("match (p:Type{name:'" + type + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (b)-[:belong_to]->(p)" )else:for i in range(0,len(types)):if types[i] not in list_item:graph.run ("CREATE (type:Type {name:'" + types[i] + "'})" )list_item.append ( types[i] )type_relation="match (p:Type{name:'" + types[i] + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (b)-[:belong_to]->(p)"graph.run ("match (p:Type{name:'" + types[i] + "'}),(b:Movie{name:'" + film + "'})" + "CREATE (b)-[:belong_to]->(p)" )except:continue

代码比较粗糙,后续再完善。

3、知识图谱show

整体效果如上图,即可以通过country、type、time信息显性化的检索相关信息,如果只将movie、director、actor作为node,则需要点击具体节点才能看到其属性country、type、time等信息。

如此,一个简易的豆瓣top250知识图谱就构建好了,但是,此处仍存在一个问题-数据重复,做完后发现不仅仅是节点有重复,关系竟然也有重复的,这个问题还在探究中。

python在线爬取数据导入Neo4j创建知识图谱相关推荐

  1. Python 学习 02 —— Python如何爬取数据

    文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...

  2. python requests 爬取数据

    python requests 爬取数据 import requests from lxml import etree import time import pymysql import json h ...

  3. Python爬虫---爬取数据(上)

    又是女票,拿了3万多条的13年某地区的公司信息,但是三年过去了,工商局的注册信息发生了巨大变化,有的注册资本增加了,有的公司老板变多了,更有不少公司不存在了,因此,需要一份最新的信息以便于她进行使用. ...

  4. 如何用六步教会你使用python爬虫爬取数据

    前言: 用python的爬虫爬取数据真的很简单,只要掌握这六步就好,也不复杂.以前还以为爬虫很难,结果一上手,从初学到把东西爬下来,一个小时都不到就解决了. python爬出六部曲 第一步:安装req ...

  5. python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...

    原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...

  6. python初学者爬取数据完整教程

    都说python爬网页数据方便,我们今天就来试试,python爬取数据到底有多方便 简介 爬取数据,基本都是通过网页的URL得到这个网页的源代码,根据源代码筛选出需要的信息 准备 IDE:pyChar ...

  7. python定时爬取数据_python实现scrapy爬虫每天定时抓取数据的示例代码

    1. 前言. 1.1. 需求背景. 每天抓取的是同一份商品的数据,用来做趋势分析. 要求每天都需要抓一份,也仅限抓取一份数据. 但是整个爬取数据的过程在时间上并不确定,受本地网络,代理速度,抓取数据量 ...

  8. Python爬虫爬取数据

    我是Python小白,我会用比较通俗易懂的方法告诉你如何去爬取数据. 一开始,我们需要pycharm(也就是我们编代码的工具),其次我们需要打开我们需要爬取数据的网页,我以鞋子为例. 那么,接下来就开 ...

  9. 采用python爬虫爬取数据然后采用echarts数据可视化分析

    前言:采用python爬虫爬取天气数据然后采用echarts数据可视化画图分析未来天气变化趋势 从获取数据到可视化的流程 (熟悉爬虫爬取数据然后数据可视化这个过程) 一.python爬取未来8-15天 ...

最新文章

  1. 人生必须知道的十个为什么
  2. access查询5月份出生_Access and VBA - 5分钟概览
  3. 关于linux的root用户密码忘记处理成绩
  4. 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
  5. redis启动管理脚本
  6. 工信部:支持符合条件的工业互联网企业上市
  7. 创建xhr对象实现浏览器全兼容
  8. 接死你(骚扰拦截利器) V2 登录木蚂蚁市场了!速速下载,反击骚扰!
  9. 【Ubuntu】Linux系统安装谷歌浏览器简易教程
  10. 可三维成像(16,32线等)激光雷达调研
  11. 2022注册测绘师备考开始 还在不知所措?手把手教你怎么考?
  12. c语言pow立方根,C#math.pow立方根计算(C# math.pow cube root calculation)
  13. python第七天作业
  14. 四代增强方式和Enhancement查找方法
  15. 4237. 【五校联考5day1】Melancholy (Standard IO)
  16. 众筹php,PHP众筹网源码 众筹网源码
  17. 苍南五凤茶进杭城“香”约西湖龙井, 茶旅融合助力乡村振兴!
  18. 换计算机硬盘分区,笔记本提速,换硬盘,分区,系统迁移,装机!
  19. UML建模工具使用之懒人操作
  20. blender FLIP-Fluids 流体插件中文帮助文档系列01

热门文章

  1. “云+医疗”时代来临,医疗桌面云市场步入快车道
  2. OSG官网——GettingStarted翻译
  3. 2021年暑假数学建模第三次模拟赛:全国各省人均消费分析与预测(很好的SPSS统计训练)
  4. 如何在公众号内优雅地添加代码块?我推荐几款常用的发帖工具!
  5. 自然语言处理笔记5-哈工大 关毅
  6. 【竞赛篇-经费奖金退税】怎么把国创(大创)经费和学校奖金交的税退出来?
  7. 北京计算机组装在哪,计算机组装与维护(第2版)
  8. 【Behaviors】
  9. jQuery Autocomplete 自动完成插件
  10. 单片机C51(STC89C52RC)独立按键控制LED亮灭、状态、显示二进制、位移