8

我在我的应用程序中使用 urlfetch,虽然在开发环境中一切正常,但我发现 urlfetch 在实际部署时非常不可靠。有时它会正常工作(检索数据),但几分钟后它可能什么也没有返回,然后几分钟后它会再次正常工作。这是非常不可接受的。我已经检查以确保问题不是源 URL (YQL),而且在开发环境中一切正常。

有没有我可以尝试的第三方库?

示例代码:

url = "http://query.yahooapis.com/v1/public/yql?q=%s&format=json" % urllib.quote_plus(query)
result = urlfetch.fetch(url, deadline=10)

if result.status_code == 200:
    r = json.loads(result.content)
else:
    return

a = r['query']['results']
# Do stuff with 'a'

有时它会正常工作,但其他时候 - 完全随机,没有代码更改 - 我会得到这个错误:

a = r['query']['results']
TypeError: 'NoneType' object is unsubscriptable
4

3 回答 3

11

有时它会正常工作,但有时完全随机,无需更改代码

这是您的应用程序的请求已超过 Yahoo API 调用速率限制的常见症状。

引用Yahoo 开发人员文档的速率限制:

基于 IP 的限制

我们的服务速率限制是对特定时间窗口内每个 IP 地址进行的 API 调用次数的限制。如果您的 IP 地址在此期间发生变化,您可能会发现自己有更多可用的“信用”。但是,如果其他人一直在使用该地址并达到限制,则您需要等到该时间段结束时才允许进行更多 API 调用。

Google App Engine 为传出的 urlfetch 请求使用 IP 地址池,并且您的应用程序正在与调用相同 Yahoo 端点的其他应用程序共享这些 IP 地址;当超过速率限制时,端点会回复一个超出限制的错误,导致 UrlFetch 失败。
是另一个使用 Twitter 搜索 API 的案例。

当您混合使用 Google App Engine+第三方 Web API 时,您需要确保 API 提供经过身份验证的调用,从而允许您的应用程序拥有自己的配额(例如StackApps API)。

于 2011-01-28T10:43:46.013 回答
1
import urllib2
response = urllib2.urlopen('http://python.org/')
html = response.read()
于 2016-07-03T15:08:51.980 回答
0

这不是 URLFetch 中的错误 - 这是返回的 JSON 的问题。要么json.loads返回 None,要么返回r['query']- 我猜可能是后者。尝试记录result.content以查看服务返回的内容。您可能还想 cehck result.status

一种可能性是您的请求在生产中被雅虎拒绝或速率限制,但不是在您的开发机器上。

于 2011-01-28T01:58:16.220 回答