如何获取维基百科页面中的所有URL

时间:2013-02-14 19:29:58

标签: wikipedia-api

似乎Wikipedia API对链接的定义与URL不同?我正在尝试使用API​​返回特定Wiki页面中的所有URL。

我一直在玩this query我在this page下发现的生成器和重定向。

2 个答案:

答案 0 :(得分:11)

我不确定你为什么会感到困惑(如果你解释的话会有所帮助),但我很确定查询不是你想要的。它列出了从“标题”(prop=links)页面链接(generator=links)的页面上的链接(titles=Title)。它还仅列出链接第一页上的第一页链接(页面大小为默认值10)。

如果您想获取“标题”页面上的所有链接:

  1. 仅使用prop=links,您不需要发电机。
  2. 通过添加pllimit=maxpllinks的“前缀”)将限制增加到最大值
  3. 使用query-continue元素中给出的值转到结果的第二页(及以后)。
  4. 因此,第一页的查询将是:

    http://en.wikipedia.org/w/api.php?action=query&titles=Title&prop=links&pllimit=max

    第二页(在这种情况下,最后一页):

    http://en.wikipedia.org/w/api.php?action=query&titles=Title&prop=links&pllimit=max&plcontinue=226160|0|Lieutenant_General

    另一件令您感到困惑的事情是links只返回内部链接(返回其他维基百科页面)。要获取外部链接,请使用prop=extlinks。您还可以将两者合并为一个查询:

    http://en.wikipedia.org/w/api.php?action=query&titles=Title&prop=links|extlinks

答案 1 :(得分:0)

这是一个Python解决方案,可获取(并打印)从特定页面链接到的所有页面。它获取第一个请求中的最大链接数,然后查看返回的JSON对象是否具有“ continue”属性。如果是这样,它将“ plcontinue”值添加到params字典中并发出另一个请求。 (返回的结果的最后一页将没有此属性。)

import requests

session = requests.Session()

url = "https://en.wikipedia.org/w/api.php"
params = {
    "action": "query",
    "format": "json",
    "titles": "Albert Einstein",
    "prop": "links",
    "pllimit": "max"
}

response = session.get(url=url, params=params)
data = response.json()
pages = data["query"]["pages"]

pg_count = 1
page_titles = []

print("Page %d" % pg_count)
for key, val in pages.items():
    for link in val["links"]:
        print(link["title"])
        page_titles.append(link["title"])

while "continue" in data:
    plcontinue = data["continue"]["plcontinue"]
    params["plcontinue"] = plcontinue

    response = session.get(url=url, params=params)
    data = response.json()
    pages = data["query"]["pages"]

    pg_count += 1

    print("\nPage %d" % pg_count)
    for key, val in pages.items():
        for link in val["links"]:
            print(link["title"])
            page_titles.append(link["title"])

print("%d titles found." % len(page_titles))

此代码改编自MediaWiki API:Links示例中的代码。