如何使用pywikibot登录wikidata

时间:2017-06-19 06:04:53

标签: python wikidata 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是纽约时报的wikidata代码):

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.

我的user-config.py文件位于同一目录中,如下所示:

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

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

取消注释最后两行并没有什么不同。

有人知道这个问题吗?当我搜索“纽约时报”时,为什么pywikibot要我登录?但是当我使用代码时却没有?

2 个答案:

答案 0 :(得分:1)

wikidata中的商品页面的标​​题是他们的问题&#39; Q&#39; ID。因此

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

创建一个不存在的页面:

>>> item.exists()
False
对于wikidata网站,

和item.get()失败。 你必须运行:

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

令牌用于编辑存储库中的内容,而不仅仅是检索并且您需要登录。

答案 1 :(得分:1)

  

但后来我收到了错误:

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

这是因为在Wikidata主命名空间中确实不存在名为“纽约时报”的页面。如果你知道确切的维基百科页面标题,如果你想获得他们的维基数据项目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并访问该页面底部列出的页面链接。