似乎Wikipedia API对链接的定义与URL不同?我正在尝试使用API返回特定Wiki页面中的所有URL。
我一直在玩this query我在this page下发现的生成器和重定向。
答案 0 :(得分:11)
我不确定你为什么会感到困惑(如果你解释的话会有所帮助),但我很确定查询不是你想要的。它列出了从“标题”(prop=links
)页面链接(generator=links
)的页面上的链接(titles=Title
)。它还仅列出链接第一页上的第一页链接(页面大小为默认值10)。
如果您想获取“标题”页面上的所有链接:
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
答案 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示例中的代码。