如何从维基百科页面标题获取页面ID



我正在尝试从维基百科中找到页面列表的wiki id。因此,格式为:

输入:维基百科页面标题列表

输出:维基百科页面ID列表。

到目前为止,我已经通过Mediawiki API了解如何进行,但找不到实现该功能的正确方法。任何人都可以建议如何获取页面ID列表吗?

查询页面基本信息:

import requests
page_titles = ['A', 'B', 'C', 'D']
url = (
'https://en.wikipedia.org/w/api.php'
'?action=query'
'&prop=info'
'&inprop=subjectid'
'&titles=' + '|'.join(page_titles) +
'&format=json')
json_response = requests.get(url).json()
title_to_page_id  = {
page_info['title']: page_id
for page_id, page_info in json_response['query']['pages'].items()}
print(title_to_page_id)
print([title_to_page_id[title] for title in page_titles])

这将打印:

{'A': '290', 'B': '34635826', 'C': '5200013', 'D': '8123'}
['290', '34635826', '5200013', '8123']

如果标题过多,则必须在多个请求中查询它们,因为一次可以查询的标题数量有 50(机器人为 500(的限制。

只要您没有非规范化的标题(例如类别页面"Category:Computer_storage_devices"(或特殊字符(如 &(即可使用 AXO 提供的答案。

在这种情况下,还需要将响应映射到规范化标题,如下所示:

def get_page_ids(page_titles):
import requests
from requests import utils
page_titles_encoded = [requests.utils.quote(x) for x in page_titles]
url = (
'https://en.wikipedia.org/w/api.php'
'?action=query'
'&prop=info'
'&inprop=subjectid'
'&titles=' + '|'.join(page_titles_encoded) +
'&format=json')
# print(url)
json_response = requests.get(url).json()
# print(json_response)
page_normalized_titles = {x:x for x in page_titles}
result = {}
if 'normalized' in json_response['query']:
for mapping in json_response['query']['normalized']:
page_normalized_titles[mapping['to']] = mapping['from']
for page_id, page_info in json_response['query']['pages'].items():
normalized_title = page_info['title']
page_title = page_normalized_titles[normalized_title]  
result[page_title] = page_id
return result

get_page_ids(page_titles = ['Category:R&J_Records_artists', 'Category:Computer_storage_devices', 'Category:Main_topic_classifications'])

将打印

{'Category:R&J_Records_artists': '33352333', 'Category:Computer_storage_devices': '895945', 'Category:Main_topic_classifications': '7345184'}.

查询维基百科API以获取映射可能有点耗时,因为其使用有一些限制。

如果您可以下载维基百科转储并使用wikiextractor将其转换为JSON格式,那就更好了。现在,键id是指维基百科页面ID,title是指维基百科页面标题。因此,我们一次性获得了维基百科中所有页面的映射!

相关内容

  • 没有找到相关文章

最新更新