【问题标题】:Accessing netflix api from python's urllib2 results in 500 error从 python 的 urllib2 访问 netflix api 导致 500 错误
【发布时间】:2015-04-12 16:31:48
【问题描述】:

我目前正在尝试修复一个名为 NetfliXBMC 的 Kodi 插件。

它使用这个 url 来获取特定电影的信息:

http://www.netflix.com/JSON/BOB?movieid=<SOMEID>

在尝试构建一个最小案例来提出这个问题时,我发现甚至不需要登录即可访问信息,这大大简化了我的问题。

通过 wget、curl、incognito chrome 等查询有关电影的信息。它永远不会在 urllib2 中工作:

# wget works just fine
$: wget -q -O- http://www.netflix.com/JSON/BOB?movieid=80021955
    {"contextData":"{\"cookieDisclosure\":{\"data\":{\"showCookieBanner\":false}}}","result":"success","actionErrors":null,"fieldErrors":null,"actionMessages":null,"data":[output omitted for brevity]}

# so does curl
$: curl http://www.netflix.com/JSON/BOB?movieid=80021955
        {"contextData":"{\"cookieDisclosure\":{\"data\":{\"showCookieBanner\":false}}}","result":"success","actionErrors":null,"fieldErrors":null,"actionMessages":null,"data":[output omitted for brevity}


# but python's urllib always gets a 500
$: python -c "import urllib2; urllib2.urlopen('http://www.netflix.com/JSON/BOB?movieid=80021955').read()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: Internal Server Error

$: python --version
Python 2.7.6

到目前为止我已经尝试过:几个不同的用户代理字符串,使用 cookie jar 初始化 urlopener,普通的旧 urllib(不会引发异常,但会收到相同的错误页面)。

我真的很好奇为什么会这样。提前致谢!

【问题讨论】:

  • 很好奇,它与 requests 库配合得很好
  • 好奇者和好奇者,它也适用于古老的urllib!-) 让你想拍一个 tcp 跟踪器,看看 urllib2 究竟是如何设法解决 netflix 错误的(500 == 服务器-side bug),而其他任何一个都没有。但我只是在任何 netflix 用作问题跟踪器的地方提交一个错误,然后让他们调试 他们的问题:-)。
  • @alex 似乎 netflix 正在停用它的 API,我怀疑他们是否愿意为此提供帮助。对我来说,它不适用于普通的 urllib
  • 它不适用于手动 http over telnet 或者:s。我会用它做更多的测试,并用我发现的任何东西更新问题。
  • @gnp,我已经指定了“带有 python 2.7 的 urllib”(在带有 Python 3.any 的 urllib 中没有 urlopen)。无论如何,是的,如果该 API 被弃用,他们肯定不会花费周期来调试其错误的实现——tcp 跟踪以找出每种情况下发生的确切情况是一种方法。

标签: python json urllib2 netflix


【解决方案1】:

当没有发送Accept 标头时,结果是netflix 方面的一个错误。

这不起作用:

opener = urllib2.build_opener()
opener.open("http://www.netflix.com/JSON/BOB?movieid=80021955")

添加适当的接受标头使其工作:

opener = urllib2.build_opener()
mimeAccept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
opener.addheaders = [('Accept', mimeAccept)]
opener.open("http://www.netflix.com/JSON/BOB?movieid=80021955")
[...]

当然,这里还有另一个错误:当问题明显在请求中时,它返回 500 internal server error 而不是 400 bad request

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多