9

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

我一直在玩这个查询,我在这个页面的生成器和重定向下找到了这个查询。

4

2 回答 2

16

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

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

  1. 使用 just prop=links,您不需要生成器。
  2. pllimit=max通过添加(pl是 的“前缀” links)将限制增加到可能的最大值
  3. 使用query-continue元素中给定的值来访问结果的第二页(和后续页)。

因此,第一页的查询将是:

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

于 2013-02-14T21:37:23.893 回答
2

这是一个 Python 解决方案,它获取(并打印)从特定页面链接到的所有页面。它获取第一个请求中的最大链接数,然后查看返回的 JSON 对象是否具有“继续”属性。如果是这样,它会将“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示例中的代码。

于 2019-09-18T00:03:22.050 回答