运用爬虫和neo4j数据库制作体育人物图谱(demo)

运用爬虫和neo4j数据库制作体育人物图谱(demo)

总体思路:从虎扑网站爬取体育人物列表,再通过人物列表去百度百科爬取人物关系列表,将两个文件都以csv格式保存,导入neo4j数据库制成人物图谱。

其中爬虫筛选数据用的是xpath

1. 爬取数据

  • 爬取体育人物列表
    通过虎扑网站爬取体育人物,网址

导入的类以及UA的设置:

from lxml import etree
import requests
import time
import csv

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31',
}

定义一个工具函数,传入url解析数据用的xpath,返回爬取的列表:

def search_by_xpath(url, xpath):
    resp = requests.get(url, headers=headers)
    text = resp.text
    parser = etree.HTML(text)
    list = parser.xpath(xpath)
    # print(list)
    return list

由网站的格式可知要获得球员姓名,就必须先进入球队,再在球队的url中解析出人物,因此:
定义解析球队的函数:

def parse_team_url(url, xpath):
    player_url_list = search_by_xpath(url, xpath)
    for player_url in player_url_list:
        parse_player_url(player_url, '/html/body/div[3]/div[4]/table/tbody/tr/td[2]/b/a/text()')

        time.sleep(5)

定义解析球员的函数:

def parse_player_url(url, xpath):
    player_list = search_by_xpath(url, xpath)
    for player in player_list:
        players.append(player)
        print(player)

    print("---")

其中players为定义的全局列表,用于储存player信息

便于模块化,定义调用以上两个函数的函数:(后续打算加入get其他players的函数)

def get_NBA_players(url):
    parse_team_url(url, '//span/a/@href')

最后定义主函数:

def main():

    get_NBA_players(url)
    header = ['player']
    with open('player.csv', 'w', encoding='utf-8', newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(header)
        for player in players:
            writer.writerow([player])

文件以csv格式保存,最后的[player]不加[]会导致 保存的文件每个字中间多个,

完成后的文件截取:
在这里插入图片描述

  • 爬取体育人物关系
    通过百度百科爬取人物关系
    主函数中载入刚刚的player.csv,并解析出每个player对应的百科url
def main():
    # https://baike.baidu.com/item/
    with open("player.csv", 'r', encoding='utf-8') as fp:
        players = csv.reader(fp)  # 返回列表

        for player in players:
            data = {'fromtitle': player[0]}
            query = parse.urlencode(data)
            path = query[10:]
            url = 'https://baike.baidu.com/item/' + path + '?' + query
            parse_relation(player[0],url)
            time.sleep(2)

定义提取关系的函数:

def parse_relation(player,url):
    relation_list = search_by_xpath(url,'//div[@class="info"]//span[@class="name"]/text()')
    if relation_list == None: # 如果关系为空,则返回
        return
    relation_people_list = search_by_xpath(url,'//div[@class="info"]//span[@class="title"]/text()')

# for r in relation_list:
#     print(r)
# for rs in relation_people_list:
#     print(rs)
for i in range(0,len(relation_people_list)):
    relations.append((player,relation_list[i],relation_people_list[i]))
    print(relations)

其中relations为定义的全局列表,用于储存每个人物关系的三元组
最后主函数中保存文件:

header = {'subject','relation','object'}
    with open('player_relation.csv', 'w', encoding='utf-8', newline='') as fp:
        writer = csv.writer(fp)
        writer.writerow(header)
        for relation in relations:
            writer.writerows([relation])

完成后的文件截图:(赏心悦目的三元组形式)
在这里插入图片描述

2、导入neo4j数据库制成人物关系图谱

  • 导入数据
    在这里插入图片描述
    将爬取的两个文件导入neo4jimport目录下:
    在这里插入图片描述
    在这里插入图片描述
    load两个文件:
load csv from 'file:///player.csv' as line
create (:player {name:line[0]})

导入成功显示player节点:
在这里插入图片描述

load csv from 'file:///player_relation.csv' as line
create (:playerRelaltion {subject:line[0],rela:line[1],object:line[2]})

导入成功效果:
在这里插入图片描述

  • 创建节点间关系
    通过语句创建图谱:
match (n:player),(m:playerRelation),(l:player) where n.name=m.subject and l.name=m.object
create (n)-[r:关系{relation:m.rela}]->(l)

创建成功结果:
在这里插入图片描述

至此大功告成!


遇到的问题:

1、爬虫方面:
主要的问题在保存,总是不能以想要的形式保存,最后也算是一次次试,总算试出了合适的保存方式
2、数据库方面:
由于我爬取的体育人物数据中会存在这个情况,一边是勒布朗·詹姆斯,一边是勒布朗-詹姆斯,其中·-的区别我一开始没注意,导致匹配不到对应节点,后来更改了才成功,可能是虎扑数据和百度百科数据格式的差异吧。
还有就是一些CQL的语句还不太熟练,翻一下使用文档还是可以解决的

不足之处:

从最后显示的人物图谱上来看,其实比我预期的要小,分析了一下原因:我通过爬取来的体育人物清单再去爬取他们的关系,而他们的关系中的家人、教练等等的关系人物,在我的体育人物清单中是不存在的,于是这个关系就没有,甚至一些队友关系的人物,如果已经退役或者其他什么原因,就不在人物清单上了,这样的一部分节点也无法形成图谱,目前只有考虑往人物清单中添加人物的方法来解决,不知道看到这的大家有没有什么更好的想法可以提供

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot可以通过使用多个数据源来同时连接MySQL和Neo4j数据库。 首先,我们需要在Spring Boot的配置文件中设置两个数据源的相关属性。对于MySQL数据库,我们可以使用以下配置: spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver 对于Neo4j数据库,我们可以使用以下配置: spring.data.neo4j.uri=bolt://localhost:7687 spring.data.neo4j.username=neo4j spring.data.neo4j.password=password 同时,我们需要在Spring Boot应用程序中定义两个数据源的bean。可以使用以下方式: @Configuration public class DataSourceConfig { @Bean(name = "mysqlDataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource mysqlDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "neo4jDataSource") @ConfigurationProperties(prefix = "spring.data.neo4j") public DataSource neo4jDataSource() { return DataSourceBuilder.create().build(); } } 接下来,在需要使用数据库的地方,可以使用@Qualifier注解来指定具体的数据源。 @Autowired @Qualifier("mysqlDataSource") private DataSource mysqlDataSource; @Autowired @Qualifier("neo4jDataSource") private DataSource neo4jDataSource; 这样,我们就可以同时连接MySQL和Neo4j数据库并使用它们来进行相应的操作了。 ### 回答2: Spring Boot可以同时连接MySQL和Neo4j数据库。首先,需要在pom.xml文件中添加相应的依赖。 对于连接MySQL数据库,可以使用Spring Boot提供的Spring Data JPA。在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 然后,在application.properties文件中配置MySQL相关属性,如数据库连接URL、用户名和密码等。 接下来,要连接Neo4j数据库,可以使用Spring Boot提供的Spring Data Neo4j。在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-ogm-embedded-driver</artifactId> </dependency> ``` 然后,在application.properties文件中配置Neo4j相关属性,如数据库路径等。 最后,可以分别创建对应的Repository接口,使用注解指定对应的数据库类型和表。 通过以上步骤,就可以同时连接MySQL和Neo4j数据库。在编写业务逻辑时,可以通过注入对应的Repository接口来使用数据库操作方法,以实现对两种数据库的数据读写。 ### 回答3: Spring Boot可以同时连接MySQL和Neo4j数据库。连接MySQL数据库需要添加MySQL驱动依赖,例如: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 然后在应用的配置文件中配置MySQL数据库的连接信息,例如: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 ``` 连接Neo4j数据库需要添加Neo4j驱动依赖,例如: ```xml <dependency> <groupId>org.neo4j.driver</groupId> <artifactId>neo4j-java-driver</artifactId> </dependency> ``` 然后在应用的配置文件中配置Neo4j数据库的连接信息,例如: ```properties spring.data.neo4j.uri=bolt://localhost spring.data.neo4j.username=neo4j spring.data.neo4j.password=123456 ``` 接下来,可以通过Spring Boot的数据访问层(如JPA或Spring Data Neo4j)来访问MySQL和Neo4j数据库。 对于MySQL数据库,可以使用JPA来进行数据访问,例如创建一个实体类并加上`@Entity`和`@Table`注解,定义实体的属性和数据库表的映射关系。然后可以创建一个`Repository`接口继承`CrudRepository`接口,通过编写简单的方法签名可以实现对数据库的增删改查操作。 对于Neo4j数据库,可以使用Spring Data Neo4j来进行数据访问,例如创建一个节点实体类并加上`@Node`注解,定义节点的属性。然后可以创建一个`@Repository`接口,使用Cypher语句进行数据访问操作。可以通过`@Query`注解编写自定义的Cypher语句,或者使用Spring Data Neo4j提供的自动解析方法名称的功能。 这样,就可以在Spring Boot应用中同时连接MySQL和Neo4j数据库,并进行相应的数据访问操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值