为什么这个python请求每次都返回相同的值?

时间:2015-03-05 20:41:34

标签: python python-requests mediawiki-api

我第一次使用python请求库,我很困惑。当我在for循环中使用不同的基本URL运行下面的函数时,它似乎收到响应,但两个URL返回的内容相同。

如果我在浏览器中查看API网址,那么我发现它是两次返回的第一个网址的内容。我错过了什么?

base_urls = ['http://kaweki.wikia.com/','http://solarmovie.wikia.com/']


def getEdits(wikiObj, limit=500):     
    payload = {'limit': limit}                             
    r = requests.get('{}api/v1/Activity/LatestActivity'.format(wikiObj),
                     params=payload)
    edits = r.json()
    return edits['items']

for url in base_urls:
    print getEdits(url)  

3 个答案:

答案 0 :(得分:3)

API端点被打破"。重复刷新浏览器中的两个端点会使它们在两个响应之间来回切换。您可以通过刷新一次请求六次来复制它,然后刷新另一个请求六次并且每六次请求来回切换。

请求A:

http://solarmovie.wikia.com/api/v1/Activity/LatestActivity

请求B:

http://kaweki.wikia.com/api/v1/Activity/LatestActivity

回应1:

{
    items: [
        {
            article: 1461,
            user: 26127114,
            revisionId: 14,
            timestamp: 1424389645
        },
        {
            article: 1461,
            user: 26127114,
            revisionId: 13,
            timestamp: 1424389322
        },
        {
            article: 1461,
            user: 26127114,
            revisionId: 12,
            timestamp: 1424389172
        },
        {
            article: 1461,
            user: 26127114,
            revisionId: 5,
            timestamp: 1424388924
        }
    ],
    basepath: "http://kaweki.wikia.com"
}

回应2:

{
    items: [
        {
            article: 1461,
            user: 26127165,
            revisionId: 14,
            timestamp: 1424389107
        },
        {
            article: 1461,
            user: 26127165,
            revisionId: 7,
            timestamp: 1424388706
        }
    ],
    basepath: "http://solarmovie.wikia.com"
}

答案 1 :(得分:3)

服务器端的错误,它会忽略缓存控制标头等一段时间。

引入5秒(甚至更短的时间段)的睡眠可以解决这个问题。我已经标记了下面添加的行:


import requests
import json
from time import sleep #ADDED

base_urls = ['http://kaweki.wikia.com/', 'http://solarmovie.wikia.com/']


def getEdits(wikiObj, limit=500):       
    payload = {'limit': limit}   
    url = '{}api/v1/Activity/LatestActivity'.format(wikiObj)
    r = requests.get(url, params=payload) 
    edits = json.loads(r.content)
    return edits['items']

for url in base_urls:    
    print getEdits(url)  
    sleep(5) # ADDED

<强>输出

[{u'article': 1461, u'revisionId': 14, u'user': 26127114, u'timestamp': 1424389645}, {u'article': 1461, u'revisionId': 13, u'user': 26127114, u'timestamp': 1424389322}, {u'article': 1461, u'revisionId': 12, u'user': 26127114, u'timestamp': 1424389172}, {u'article': 1461, u'revisionId': 5, u'user': 26127114, u'timestamp': 1424388924}]
[{u'article': 1461, u'revisionId': 14, u'user': 26127165, u'timestamp': 1424389107}, {u'article': 1461, u'revisionId': 7, u'user': 26127165, u'timestamp': 1424388706}]

答案 2 :(得分:0)

我下载并运行了脚本并获得了明显相同的输出。但是,脚本似乎没有任何问题!出于某种原因,我认为输出完全相同。尝试将return edits['items']更改为仅return edits,并且您会在这种情况下看到输出不同。如果代码中确实存在错误,那么应该可以帮助您隔离它;如果没有,那么也许你可以弄清楚为什么真正的输出是这样的。