调用Wikipedia API时action参数被忽略?不同URL返回相同结果
问题根因
不是MediaWiki API忽略URL里的action参数,问题出在requests库的参数拼接逻辑上。
当你调用S.get(url=URL, params=PARAMS)时,requests会自动把PARAMS字典里的所有键值对追加/拼接到请求URL的查询字符串部分,如果原URL里已经存在同名参数,会直接被PARAMS里同key的值覆盖。
你取消注释的URL里自带的action=feedcontributions、user=Urmi27两个参数,会被PARAMS里写死的action: "query"以及其他最近更改相关的参数覆盖,最终实际发出的请求和使用第一个无参数URL的请求完全相同,自然返回结果没有区别。
修正方法
两种改法都能实现查询指定用户贡献的需求:
- 方法一:统一在
PARAMS字典里维护所有请求参数,不要把参数硬拼接在URL中(推荐,可读性和可维护性更好)
import requests S = requests.Session() URL = "https://en.wikipedia.org/w/api.php" # 查询用户贡献的参数,注意如果要返回JSON格式,不建议用feedcontributions(默认返回RSS/XML),用query接口下的usercontribs模块更合适 PARAMS = { "format": "json", "action": "query", "list": "usercontribs", "ucuser": "Urmi27", "uclimit": "3", "ucprop": "comment|title|ids|size" } R = S.get(url=URL, params=PARAMS) DATA = R.json() contributions = DATA['query']['usercontribs'] for contrib in contributions: print(contrib['title'])
- 方法二:如果要使用提前拼接好参数的完整URL,调用
get方法时不要传入params参数
import requests S = requests.Session() # 直接使用拼好所有参数的完整URL,不再额外传PARAMS URL = "https://en.wikipedia.org/w/api.php?action=query&list=usercontribs&ucuser=Urmi27&uclimit=3&format=json&ucprop=comment|title|ids|size" R = S.get(url=URL) DATA = R.json() contributions = DATA['query']['usercontribs'] for contrib in contributions: print(contrib['title'])
注意:
action=feedcontributions是用于生成RSS订阅源的接口,默认返回XML格式内容,不支持直接返回JSON结构,如果需要程序化解析贡献数据,优先选择action=query+list=usercontribs的参数组合。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

