urllib2.urlopen 对于浏览器能返回的页面返回404
背景:我正在学习Toby Segaran的《编程集体智能》这本书,特别是第5章的Kayak API示例。
我可以用我的浏览器(Chrome)访问Kayak API的结果页面(全部是XML格式),链接在这里:http://www.kayak.com/s/basic/flight?searchid=[searchidhere]&c=999&apimode=1&sid=[sessionidhere]&version=1
(我之前已经成功创建了会话ID和搜索ID)
但是,当我使用
import urllib2
import xml.dom.minidom
url = 'http://www.kayak.com/s/basic/flight?searchid=NQnNrj&c=999&apimode=1&_sid_=19-y2WnyKIGm1FuaLfo2keV&version=1'
doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())
时,我得到了以下响应
[...discarded top bit of Traceback...]
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
我在Python 2.5.4和Python 2.7.1上都测试过。我几乎可以肯定之前试过这个是成功的,但我不知道哪里出错了。
有没有人能帮帮我?谢谢!
3 个回答
如果你在浏览器里试着运行上面的查询,你也会看到404错误,只不过他们选择了把这个404错误格式化一下并显示出来。请求的状态从302变成了404,而urllib2也是在做同样的事情。
最可能的原因是你的搜索结果已经失效(过时了)。Chrome浏览器可能会显示缓存中的数据,你可以尝试刷新一下页面,看看结果是否还在。
另外,网页可能需要之前保存的一个小文件(叫做cookie)。
可能你的问题和 cookies 有关。巧合的是,我通常在不需要 JavaScript 或 cookies 的网站上浏览网页,所以我在这种情况下点击了链接。
在没有启用 JavaScript、cookies 和 Referer 信息的情况下,我得到了一个 404 页面。然后我启用了这些功能,结果出现了一个“搜索过期”的页面。为了验证我的想法,我再次启用了 JavaScript 和 Referer,然后点击了链接,结果又回到了 404 页面。
所以,建议你使用 HTTPCookieProcessor 来创建一个打开器,这样问题应该就能解决了。
祝好