2015-03-05 4 views
4

Я впервые использую библиотеку запросов python, и я смущен. Когда я запускаю функцию ниже в цикле for с разными базовыми URL-адресами, он, как представляется, получает ответ, но возвращаемый контент одинаковый для обоих URL-адресов.Почему этот запрос python возвращает одно и то же значение каждый раз?

Если я посмотрю URL-адрес API в своем браузере, я вижу, что это содержимое для первого URL-адреса, который возвращается оба раза. Что мне не хватает?

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) 
+1

Я посмотрел его и ничего не видно, что явно проблематично. Предполагая, что оба URL-адреса назначения ведут себя одинаково и имеют разный контент, я не могу объяснить, почему результаты будут выглядеть одинаково. –

+1

Это может быть ошибка на их стороне? Может, это кеширование, где это не должно быть? – Jeremy

+1

Я сомневаюсь, что это кеширование - вот в чем проблема, но я согласен с тем, что API API полностью нарушен. Это также может быть просто трудно использовать, возвращая нерелевантные результаты из-за неочевидной детали использования. –

ответ

0

Я загрузил и запустил сценарий и получил явно идентичный результат. Хотя, похоже, что-то не так с сценарием! Я думаю, что выход по какой-то причине просто идентичен. Попробуйте изменить return edits['items'] на return edits, и вы увидите, что в этом случае результат отличается. Если в коде действительно есть ошибка, это должно помочь вам ее изолировать; если нет, то, может быть, вы можете понять, почему настоящий вывод такой.

3

Терминалы API «сломаны». Обновление двух конечных точек в браузере многократно приводит к переходу между двумя ответами. Вы можете реплицировать его, сделав обновляющий один запрос полдюжины раз, а затем обновляя другой запрос в полдюжины раз и переходя туда и обратно каждые полдюжины запросов.

Запрос:

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

Запрос Б:

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" 
} 
+0

Хотя это правда, это не очень полезно/полезно! Кроме того, можете ли вы воспроизвести поведение браузера с помощью curl/python? – alfasin

+2

Я отправил электронное письмо в их группу API, чтобы сообщить им, что похоже на ошибку. Спасибо! – Jeremy

+1

@alfasin У вопроса есть Python, который изначально показывал результаты. Как ответ на вопрос не полезен? – abraham

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}] 
+1

Хм, очень интересно. Но я думаю, что заголовок «Host:» может быть красной селедкой. В конце концов, 'запросы' уже должны добавить это сами. И на самом деле это похоже на работу с задержкой 5 с. –

+0

@ LukasGraf да, вы действительно правы! Я обновлю ответ - спасибо! – alfasin