- 前言
- 官方API使用
- `action` = `wbsearchentities`
- 参数设置
- 查询过程
- json数据解析
- `action`=`wbgetentities`
- 参数设置
- 查询过程
- json数据解析
- 维基百科数据模型(Wikidata datamodel)
- ch1.基本数据模型(Datamodel)
- ---> ch2.label(实体名称)
- ---> ch3.aliases(别名)
- ---> ch4.descriptions(描述)
- ---> ch5.claims(属性)⭐
- --> ch5.1 datatype(数据类型)
- --> ch5.2 valuetype(值类型)
- wikibase-entityid(维基数据实体id值)
- globecoordinate(地理位置)
- time(时间)
- string(字符串)
- monolingualtext(未翻译文本)
- quantity(十进制数字)
- --> ch 5.3 qualifiers-order(限定词顺序)
- --> ch 5.4 qualifiers(限定词)
- --> ch 5.5 references(引用)
- ---> ch6.sitelinks(外部链接)
- Example
- 部分`claims`
- `sitelinks`
- 维基百科是☞多种语言、内容自由个网络百科全书项目。而维基数据是一个自由的协作式的多语言辅助数据库,用于收集结构化的数据,旨在支援维基百科、维基共享资源以及其他维基媒体运动中的项目。
- 维基数据可以通过多种方式访问:使用内建工具、外部工具或程序接口。
- Wikidata Query和Reasonator是搜索和检查维基数据项的一些流行工具。tools一页有大量有趣的项目可供探索。
- 客户端维基可以使用Lua Scribunto接口访问其页面的数据。您可以使用Wikidata API独立检索所有数据。
- 我们这次利用python调用官方API来实现数据的获取。
- 注意:因为某些原因wiki国内好像访问不稳定,必要请在魔法下使用
Wiki官方提供了很多不同功能的接口,具体见其官方文档。
-
url=https://www.wikidata.org/w/api.php
-
这里我们使用两个action,action=wbsearchentities和action=wbgetentities
-
action=wbsearchentities:对输入文本进行搜索得到实体id;
-
action=wbgetentities:对输入实体id搜索得到该实体的详细信息;
- 接口API文档MediaWiki API help - Wikidata
-
action:'wbsearchentities'
-
format:'json'
-
search: (带查询文本)必须⭐
-
language: (查询语言)必须⭐
-
type: (查询实体类型,默认:'item')
-
limit: (结果返回最大数量,默认:7)
-
strictlanguage: (是否禁用语言回退)非必须
-
continue: (继续搜索的偏移量,默认:0)
-
props: (返回每个实体的这些属性,默认:'url',好像只有url)
以文本"SEU"为例
import requests
url = "https://www.wikidata.org/w/api.php"
params = {
'action': 'wbsearchentities',
'format': 'json',
'search': "SEU", # 搜索文本
'language': 'en', # 查询语言(英文)
'type': 'item',
'limit': 10 # 返回最大数目
}
# 访问
get = requests.get(url=url, params=params)
# 转为json数据
re_json = get.json()
print(re_json)
json数据解析
该json数据结构较简单,分析如下:
- searchinfo:
- search:“SEU”
- search:
- 0..*(结果队列)
- id(实体id):(目标值)
- titile(实体id,同id):(目标值)
- pageid(网页id):(目标值)
- display:
- label(实体名称):
- language(语言):(目标值)
- value:(目标值)
- (description)(实体描述)
- language(语言):(目标值)
- value:(目标值)
- label(实体名称):
- repository(存储库):(目标值)
- url(实体链接):(目标值)
- concepturi(实体概念链接):(目标值)
- label(实体名称):(目标值)
- description(实体描述):(目标值)
- match(该结果的匹配实体出处,即为什么返回该实体):
- type(查询部分,label? alias(别名)?,description?):(目标值)
- language:en
- text:“SEU”
- aliases(别名,简称):
- 0..*(列表)
- (目标值)
- 0..*(列表)
- 0..*(结果队列)
- search-continue(返回结果数目):(目标值)
- success(是否查询成功):1
通过解析我们可以得到一些查询结果的实体id,比如Q3551770,但是我们只能简单知道该实体的名称、描述,如果我们想知道该实体的更多详细信息,比如属性关系等,我们就需要利用下面介绍的action=wbgetentities
action=wbgetentities- 接口API文档MediaWiki API help - Wikidata
- action:'wbgetentities'
- format:'json'
- ids: (带查询实体id,可接受多个用'|'隔开)必须⭐
- language: (查询语言)非必须
还有更多的参数可以调整设置,不过不是必须的,这里就不再介绍,详情见官方文档
查询过程以实体id Q3551770为例
import requests
url = "https://www.wikidata.org/w/api.php"
params = {
'ids': 'Q3551770', # 实体id,可多个,比如'Q123|Q456'
'action': 'wbgetentities',
'format': 'json',
'language': 'en',
}
# 访问
get = requests.get(url=url, params=params)
# 转为json数据
re_json = get.json()
print(re_json)
json数据解析
哦哦哦哦哦!重头戏来喽! 通过输出的json格式数据我们发现这个json数据”又臭又长“,看了让人头大。
其实这里的每个实体的数据包含了该实体的全部信息,符合维基百科数据模型,所以想要真正清晰的解析该json数据,就要明白维基百科数据模型层次结构。下面才开始今天真正是主题。
前方高能!
维基百科数据模型(Wikidata datamodel)- 维基百科数据模型介绍页Help:Wikidata datamodel - Wikidata
- 使用官方API(action=wbgetentities)查询wikidata返回实体json文件时,json数据的基本结构(对应键值)
- entities:
- Qxx:
- id:Qxx
- titile:Qxx
- type:item
- pageid:(目标值)
- lastrevid:(目标值)
- label: —> ch 2
- (aliases): —> ch 3
- (descriptions): —> ch 4
- (claims): —> ch 5
- (sitelinks): —> ch 6
- Qxxx:
- …
- Qxx:
- success:1
(xx为语言标记,之后不再赘述) 具体见 https://www.wikidata.org/w/api.php?action=help&modules=wbgetentities的Parameters中 language介绍。
- labels:
- xx:
- language:xx
- value:(目标值)
- xx:
- aliases:
- xx
- 0..(列表)
- language:xx
- value:(目标值)
- 0..(列表)
- xx
- descriptions:
- xx
- language:xx
- value:(目标值)
- xx
(Pxx为属性编号)
- claims:
- Pxx:
- 0..*(列表)
- mainsnak
- snaktype:value
- property:Pxx
- hash:(目标值)
- datatype: --> ch 5.1
- datavalue: --> ch 5.2
- type:statement
- (qualifiers-order): --> ch 5.3
- (qualifiers): --> ch 5.4
- (references): --> ch 5.5
- mainsnak
- 0..*(列表)
- Pxx:
- wikidata目前确定的数据类型共17种,每种数据类型对应一种值类型(valuetype)(List of all data types available - Wikidata,Help:数据类型 - Wikidata),列表如下:
| Datetype | json键值 | Valuetype |
|---|---|---|
| Commons media (参考维基共享资源上的文件,图片等) | commonsMedia | string |
| Globe coordinate (地理位置,经纬度) | globe-coordinate | globecoordinate |
| Item (内部链接到另一个项) | wikibase-item | wikibase-entityid |
| Property (指向属性的内部链接) | wikibase-property | wikibase-entityid |
| String (不需要翻译成不同语言或数字格式的字符链,数字和符号) | string | string |
| Monolingual text (未翻译为其他语言的字符串,当地语言编写的位置实体名称,某种标识符,化学式或拉丁学名) | monolingualtext | monolingualtext |
| External identifier (表示外部系统中使用的标识符的字符串) | external-id | string |
| Quantity (代表一个十进制数字,以及有关该数字的不确定性区间的信息,以及一个测量单位) | quantity | quantity |
| Time (以格里高利或朱利安日历存储日期) | time | time |
| URL (用于标识某种外部资源,可能是某种外部网站的链接) | url | string |
| Mathematical expression (显示为数学公式的格式化字符串) | math | string |
| Geographic shape (参考维基共享资源上的地图数据文件命名空间) | geo-shape | string |
| Musical Notation (描述遵循 LilyPond 语法的音乐的字符串) | musical-notation | string |
| Tabular data (参考维基共享资源上的表格数据文件命名字符串) | tabular-data | string |
| Lexeme (对于引用另一个 Lexeme 的 Lexemes 的陈述) | wikibase-lexeme | wikibase-entityid |
| Form (对于 Lexemes 上的陈述,这些陈述引用了其他 Lexeme 上的 Forms 以表明它们的关系) | wikibase-form | wikibase-entityid |
| Sense (对于在其他 Lexemes 上引用 Senses 的 Lexemes 的陈述) | wikibase-sense | wikibase-entityid |
- 确定datatype(数据类型)后,可以知道valuetype(值类型),从而确定value的结构层次;
- 由ch5.1可知,17种datatype(数据类型)对应共6种valuetype(值类型);
- datavalue:
- type:wikibase-entityid
- value:
- entity-type(实体类型):item
- numeric-id(实体id):(目标值)
- (id)(类型+id,如Q5,P31):(目标值)
- datavalue:
- type:globecoordinate
- value:
- latitude(纬度):(目标值)
- longitude(经度):(目标值)
- precision(精度):(目标值)
- globe(观测星球实体链接):(目标值)
- datavalue:
- type:time
- value:
- time(时间):(目标值)
- precision(精度):(目标值)
- before(给定时间后可能有多少个单位的显式整数值):(目标值)
- after(给定时间前可能有多少个单位的显式整数值):(目标值)
- timezone(时区信息作为与 UTC 的偏移量(以分钟为单位)):(目标值)
- calendarmodel(作为 URI 给出的显式值):(目标值)
-
datavalue:
-
type:string
-
value:(目标值)
-
- datavalue:
- type:monolingualtext
- value:
- text(文本信息):(目标值)
- language(语言):(目标值)
- datavalue:
- type:quantity
- value:
- amount(主值):(目标值)
- lowerBound(下界误差):(目标值)
- upperBound(上界误差):(目标值)
- unit(默认为“1”的字符串的隐含部分):"1"
- qualifiers-order:
- 0..*(列表)
- Pxx
- …
- 0..*(列表)
- qualifiers:
- Pxx:
- 0..*(列表)
- snaktype:value
- property:Pxx
- hash:(目标值)
- datatype: --> ch 5.1
- datavalue: --> ch 5.2
- 0..*(列表)
- Pxx:
- references:
- 0..*(列表)
- hash:(目标值)
- snaks-order:
- 0..*(列表)
- Pxx
- …
- 0..*(列表)
- snaks:
- Pxx:
- 0..*(列表)
- snaktype:value
- property:Pxx
- hash:(目标值)
- datatype: --> ch 5.1
- datavalue: --> ch 5.2
- 0..*(列表)
- Pxx:
- 0..*(列表)
- sitelinks:
- xxwiki:
- site:xxwiki
- (badges):
- 0..*(列表)
- id(目标值)
- 0..*(列表)
- title:(目标值)
- xxwikivoyage:
- site:xxwikivoyage
- (badges):
- 0..*(列表)
- id(目标值)
- 0..*(列表)
- title:(目标值)
- commonswiki:
- site:commonswiki
- (badges):
- 0..*(列表)
- id(目标值)
- 0..*(列表)
- title:(目标值)
- xxwiki:
- (https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q3551770&languages=en)结果如下
{
"entities": {
"Q3551770": {
"pageid": 3380864,
"ns": 0,
"title": "Q3551770",
"lastrevid": 1653372026,
"modified": "2022-06-03T07:33:09Z",
"type": "item",
"id": "Q3551770",
"labels": {
"en": {
"language": "en",
"value": "Southeast University"
}
},
"descriptions": {
"en": {
"language": "en",
"value": "university in Nanjing, China"
}
},
"aliases": {
"en": [
{
"language": "en",
"value": "SEU"
}
]
},
"claims": {
....
},
"sitelinks":{
...
},
"success": 1
}
部分claims
"claims":
{
"P159": [
{
"mainsnak": {
"snaktype": "value",
"property": "P159",
"hash": "5491d0bd1b2b30b9e4747254d508f277795a3c7f",
"datavalue": {
"value": {
"entity-type": "item",
"numeric-id": 16666,
"id": "Q16666"
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
},
"type": "statement",
"qualifiers": {
"P625": [
{
"snaktype": "value",
"property": "P625",
"hash": "2d91cc4e510689c095172344a17b0a0bee41fa4b",
"datavalue": {
"value": {
"latitude": 32.057777777778,
"longitude": 118.78888888889,
"altitude": null,
"precision": 0.0001,
"globe": "http://www.wikidata.org/entity/Q2"
},
"type": "globecoordinate"
},
"datatype": "globe-coordinate"
}
]
},
"qualifiers-order": [
"P625"
],
"id": "Q3551770$b269c8db-4c49-d2c9-628e-393a5c0d9b65",
"rank": "normal"
}
],
"P856": [
{
"mainsnak": {
"snaktype": "value",
"property": "P856",
"hash": "0d857dd8262d0b6729ea3b911c534d0075fbb77d",
"datavalue": {
"value": "http://www.seu.edu.cn/",
"type": "string"
},
"datatype": "url"
},
"type": "statement",
"id": "Q3551770$8ed363d2-400b-f684-a881-bd02902fe19d",
"rank": "normal"
}
],
"P910": [
{
"mainsnak": {
"snaktype": "value",
"property": "P910",
"hash": "1f3b85ac00b0aa7408defdb9e93dbf9278752b73",
"datavalue": {
"value": {
"entity-type": "item",
"numeric-id": 8781146,
"id": "Q8781146"
},
"type": "wikibase-entityid"
},
"datatype": "wikibase-item"
},
"type": "statement",
"id": "Q3551770$6C7F1667-F717-4374-A48D-4A0838D77B41",
"rank": "normal"
}
]
}
sitelinks
"sitelinks":
{
"cswiki": {
"site": "cswiki",
"title": "Jihovu00fdchodnu00ed univerzita",
"badges": []
},
"dewiki": {
"site": "dewiki",
"title": "Universitu00e4t Su00fcdostchinas",
"badges": []
},
"enwiki": {
"site": "enwiki",
"title": "Southeast University",
"badges": []
},
"frwiki": {
"site": "frwiki",
"title": "Universitu00e9 du Sud-Est",
"badges": []
},
"ganwiki": {
"site": "ganwiki",
"title": "u4e1cu5357u5927u5b66",
"badges": []
},
"idwiki": {
"site": "idwiki",
"title": "Universitas Tenggara",
"badges": []
}
}
综上,我们已经清楚了维基百科数据模型的解析的方法啦,可以愉快获得我们想要的数据啦!
如果看完觉得博主写的不错,请给博主点赞关注收藏鼓励一下哦來


![[知识图谱]Python-调用维基百科官方API查询返回json数据的数据模型解析(Wikidata datamodel)- 超详细介绍 [知识图谱]Python-调用维基百科官方API查询返回json数据的数据模型解析(Wikidata datamodel)- 超详细介绍](http://www.mshxw.com/aiimages/31/949762.png)
