Как войти в Викиданные с помощью Pywikibot

Я пытаюсь получить доступ к данным из Викиданных с помощью Pywikibot. Я пытаюсь сделать это с именем объекта данных, а не с кодом. Когда я запускаю этот скрипт:

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 - это код викиданных для New York Times):

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 хочет, чтобы я входил в систему при поиске "New York Times", а не при использовании кода?

2 ответа

Решение

Названия страниц предметов в викиданных являются их идентификатором "Q". Следовательно

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

создает страницу, которая не существует:

>>> item.exists()
False

и item.get() не работает для сайта wikidata. Вы должны запустить:

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

токен берется для того, чтобы редактировать вещи в репозитории, а не просто извлекать и для этого нужно войти в систему.

Но тогда я получаю ошибку:

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

Это происходит потому, что в главном пространстве имен Wikidata действительно не существует страницы с именем "New York Times". Если вам известны точные заголовки страниц Википедии, и если вы хотите получить их идентификатор элемента в Википедии, вы можете сделать это так:

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... для редактирования Wikidata, если вы будете использовать функции фреймворка. Смотрите более подробную информацию здесь и доступ к ссылкам на страницы, перечисленные в нижней части этой страницы.

Другие вопросы по тегам