似乎 Wikipedia API 对链接的定义与 URL 不同?我正在尝试使用 API 返回特定 wiki 页面中的所有 url。
2 回答
我不确定您到底为什么会感到困惑(如果您对此进行解释会有所帮助),但我很确定该查询不是您想要的。它列出了从页面“标题”( ) 链接 ( prop=links
) 的页面上的链接 ( )。它还仅列出第一页链接上的第一页链接(页面大小为微小的默认值 10)。generator=links
titles=Title
如果要获取“标题”页面上的所有链接:
- 使用 just
prop=links
,您不需要生成器。 pllimit=max
通过添加(pl
是 的“前缀”links
)将限制增加到可能的最大值- 使用
query-continue
元素中给定的值来访问结果的第二页(和后续页)。
因此,第一页的查询将是:
http://en.wikipedia.org/w/api.php?action=query&titles=Title&prop=links&pllimit=max
第二页(在本例中为最后一页):
可能让您感到困惑的另一件事是links
只返回内部链接(到其他维基百科页面)。要获取外部链接,请使用prop=extlinks
. 您还可以将两者合并为一个查询:
http://en.wikipedia.org/w/api.php?action=query&titles=Title&prop=links|extlinks
这是一个 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示例中的代码。