python - 维基数据查询服务 - 获取页面的创建日期

标签 python sparql wikipedia-api wikidata imdb

我正在寻找一种方法来获取英语维基百科上的所有电影,以及它们的创建日期。
对我来说,电影是附加了 IMDB ID 的页面。
所以,这是我到目前为止的查询:

SELECT DISTINCT ?item_label ?imdb_id  (year(?dateCreation) as ?AnneeCreation) WHERE {
      ?item wdt:P345 $imdb_id.
      filter STRSTARTS(?imdb_id,"tt")
  OPTIONAL{
    ?item wdt:P571 ?dateCreation.           
  }

      SERVICE wikibase:label { bd:serviceParam wikibase:language "en".}  
      ?article schema:about ?item ; schema:isPartOf <https://en.wikipedia.org/> ; schema:name ?item_label
    }

问题在于大多数页面没有 P571 属性,
所以我想知道是否有更好的方法来获取创建日期?
也许通过修订历史或其他什么,我找不到这样的选项。

任何帮助将不胜感激!

最佳答案

因此,正如评论所指出的,维基数据属性(有一些罕见的例子,如特色文章标志)描述了基本概念,而不是维基百科页面元数据。正如@AKSW 指出的那样,与维基百科 API 对话的能力有限,但我的理解是,这对于大量文章来说效果不佳(注意示例代码中的 LIMIT 50)

然而,一切都没有丢失!我最近在 Gender and Deletion on Wikipedia 中为大量文章制定了一种大规模执行此操作的方法。 ,使用一点横向思维。

第一步:找出你的维基数据查询。带有 tt 前缀的 IMDB 标签可能适用于电影以外的内容(例如电视剧集、体育广播),因此另一种方法可能是执行 P31/P279 类型/类别搜索以查找所有属于“电影或电影子类”的内容.您还需要添加一个过滤器,明确指出“并且只有英文维基百科中的一篇文章”,我看到您已经这样做了。请注意,这为您提供了 WP 文章的名称,而不是维基数据项目的“标签”,这是不同的,因此您可以删除(耗时的)标签服务条款。你最终会得到类似 https://w.wiki/FH4 的东西(这仍然使用 tt- 前缀方法并获得 180k 结果)或 https://w.wiki/FH8 (P31/P279 过滤器加 tt- 前缀,136k 结果)

运行此查询,将结果 TSV 保存在某处,然后继续执行第 2 步。我们将在此处使用的工具是 PetScan ,旨在链接来自维基百科类别、维基百科元数据、维基数据查询等的数据。

将 SPARQL 查询输入选项卡 4(“其他来源”)并在此选项卡底部说“使用 wiki:enwiki”。这将强制它输出有关从此查询链接的维基百科文章的数据。

现在点击“do it”,稍等片刻(我测试它花了大约 100 秒)并检查结果。你会看到我们得到了标题(WP 文章)、页面 ID、命名空间(希望总是“(文章)”、字节大小和最后触摸日期。这些都不是创建日期......

...除了其中一种是。 PageID 是按顺序分配的,因此它们本质上是创建时间的时间戳。这里有一些关于边缘情况的细微差别 - 例如,如果我在 2010 年创建了一个名为“示例(电影)”的重定向,并在 2015 年手动编辑了重定向以成为一篇名为“示例(电影)”的真实文章,它将显示为创建于 2010 年。对于删除和重新创建的页面,或者具有复杂页面移动历史的页面,也可能会有奇怪的结果(尽管直接页面移动应该保持 ID)。但是,一般来说,对于 95% 的项目,pageID 将反射(reflect)它在维基上首次创建的时间。例如,创建了 431900000 at 11.14am on 1 July 2014 ; 531900000 已创建 at 6.29pm on 14 February 2017 ;等等。

回到 PetScan - 让我们拉下所有这些项目。在 PetScan 中,转到最后一个选项卡并选择 TSV。重新运行搜索并保存结果文件。

现在,我们有一个带有 Wikidata ID、IMDB ID 和 WP 页面标题的 TSV(以及您想从 WD 查询中恢复的任何其他内容);我们还有另一个 WP 页面标题和页面 ID。您可以使用 WP 页面标题将它们链接在一起,让您从“维基数据中的结果”转到“页面 ID”。清理这些并根据您的喜好链接它们 - 我是在 bash 中完成的,您可能想要使用更明智的东西,比如 python。

现在您可以将 PageID 转换为创建日期。对于我所做的工作,我只对六个月的 bin 感兴趣,所以我只是计算出在每年 1 月 1 日和 7 月 1 日创建的任意 pageID,并计算它们之间的 ID。您可以做同样的事情,或者使用 API 查找单个 pageID 并获取创建时间戳 - 完全取决于您想要获得的内容。

这比仅使用查询服务要复杂一些,它“可能”会为一两篇历史复杂的文章提供虚假结果,但它基本上可以让您做您最初要求的事情。

关于python - 维基数据查询服务 - 获取页面的创建日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59599452/

相关文章:

python - 如何安全地删除 Django 中的模型字段?

python - 如何计算术语文档矩阵?

sparql - 如何在SPARQL中转置查询结果

rdf - 使用 SPARQL 查询链接电影数据库 (LMDB)

mediawiki - 维基词典导入看起来与官方网站完全不同

javascript - 使用他们的 API 构建维基百科查看器,总是出现错误

python - Wikipedia api python 返回奇怪的结果

python - 使用 run -m 时将参数传递给 IPython 中的模块

python - Blender 模态运算符(operator)无法插入关键帧和移动对象

limit - SPARQL 中的括号是什么?为什么链接的电影数据库限制为 2500 条记录?