如何使用pywikibot登录维基数据

How to login to wikidata with pywikibot

我正在尝试使用 pywikibot 从 wikidata 访问数据。我正在尝试使用数据对象的名称而不是代码来执行此操作。 当我 运行 这个脚本时:

import pywikibot


site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
token = repo.token(pywikibot.Page(repo, 'Main Page'), 'edit')

我收到此错误消息:

Traceback (most recent call last):
  File "/Users/this-user/PycharmProjects/teststuff/src/pywikibot_stuff/wikipedia/test.py", line 6, in <module>
    token = repo.token(pywikibot.Page(repo, 'Main Page'), 'edit')
  File "/Users/this-user/Library/Python/3.6/lib/python/site-packages/pywikibot/tools/__init__.py", line 1337, in wrapper
    return obj(*args, **kwargs)
  File "/Users/this-user/Library/Python/3.6/lib/python/site-packages/pywikibot/site.py", line 3495, in token
<class 'AssertionError'>
    return self.tokens[tokentype]
  File "/Users/this-user/Library/Python/3.6/lib/python/site-packages/pywikibot/site.py", line 1785, in __getitem__
    assert self.site.user(), 'User must login in this site'
AssertionError: User must login in this site
CRITICAL: Closing network session.

然而,这让我感到困惑,因为当我 运行 以下脚本(Q9684 是纽约时报的维基数据代码)时:

import pywikibot

site = pywikibot.Site('wikidata', 'wikidata')
repo = site.data_repository()
item = pywikibot.ItemPage(repo, 'Q9684')

item_dict = item.get()
aliases = item_dict['aliases']
aliases = [aliases[key] for key in aliases]
aliases = [alias for sublist in aliases for alias in sublist]


print(aliases

一切正常,我得到:

['NY Times', 'New York Times', 'The Gray Lady', 'Gray Lady', 'NYT', 'TNYT', 'nytimes.com', 'New-York Daily Times', 'The New-York Times', 'NY Times', 'NY Times', 'New York Times', 'New York Times', 'NYT', 'NY Times', 'NY Times', 'New York Times', 'The Gray Lady', 'Gray Lady', 'The Grey Lady', 'Grey Lady', 'New York Times', 'NYT', '紐約時報', 'nytimes.com', 'New York Times', 'The New York Daily Times', 'NY Times', 'New York Times', 'NYT', 'The Gray Lady', 'The New York Times', 'Нью-Йорк Таймс', 'NY Times', 'New York Times', 'NYT', 'نيو يورك تايمز']

我也试过运行宁:

import pywikibot

site = pywikibot.Site('wikidata', 'wikidata')
repo = site.data_repository()
item = pywikibot.Page(site, 'New York Times')
item_dict = item.get()

print(item_dict)

但是我得到了错误:

pywikibot.exceptions.NoPage: Page [[wikidata:New York Times]] doesn't exist.

我的用户-config.py 文件在同一目录中,如下所示:

family = 'wikidata'
mylang = 'en'
usernames['wikidata']['wikidata'] = u'ExampleBot'

#console_encoding = 'utf-8'
#use_api_login = True

取消注释最后两行没有任何区别。

有人知道这里的问题吗?为什么 pywikibot 在我搜索 'New York Times' 时要我登录,但在我使用代码时却不让我登录?

维基数据中项目页面的标题是它们的 'Q' ID。因此

item = pywikibot.Page(site, 'New York Times')

创建一个不存在的页面:

>>> item.exists()
False

和 item.get() 对维基数据站点失败。 你必须 运行:

item = pywikibot.Page(site, 'Q9684')

获取令牌是为了编辑存储库中的内容,而不仅仅是检索,为此您需要登录。

But then I get the error:

pywikibot.exceptions.NoPage: Page [[wikidata:New York Times]] doesn't exist.

发生这种情况是因为在 Wikidata 主命名空间中确实不存在名为 "New York Times" 的页面。如果你知道确切的维基百科页面标题,并且你想获得他们的维基数据项目 ID,你可以这样做:

wpsite = pywikibot.Site('en', 'wikipedia')
wppage = pywikibot.Page(wpsite, 'The New York Times')
item = pywikibot.ItemPage.fromPage(wppage) 

而不是:

item = pywikibot.Page(site, 'New York Times') # this is wrong

实际上,如果您要使用框架功能,则不需要带有 token = repo.token... 的行来编辑维基数据。 查看更多详细信息 here 并访问该页面底部列出的页面链接。