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

时间:2018-10-12 22:00:56

标签: python-3.x mediawiki

我正在尝试从Wikipedia中查找页面列表的Wiki ID。因此,格式为:

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

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

到目前为止,我已经通过Mediawiki API来了解如何进行操作,但是找不到实现该功能的正确方法。谁能建议如何获取页面ID列表?

3 个答案:

答案 0 :(得分:2)

Query basic page information:

alarm(0)

这将打印:

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])

如果标题过多,则必须在多个请求中查询它们,因为一次可以查询的标题数量受到50 (500 for bots)的限制。

答案 1 :(得分:0)

只要您没有未归类的标题(例如类别页面“ 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'}

答案 2 :(得分:0)

由于对维基百科API的使用有一些限制,因此查询Wikipedia API可能会花费一些时间。

如果您可以下载Wikipedia转储并使用wikiextractor将其转换为JSON格式会更好。现在,键id指向Wikipedia页面ID,而title则指向Wikipedia页面标题。因此,我们一口气获得了Wikipedia中所有页面的映射!