urllib2.urlopen 对于浏览器能返回的页面返回404

2 投票
3 回答
1087 浏览
提问于 2025-04-16 12:47

背景:我正在学习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 个回答

0

如果你在浏览器里试着运行上面的查询,你也会看到404错误,只不过他们选择了把这个404错误格式化一下并显示出来。请求的状态从302变成了404,而urllib2也是在做同样的事情。

0

最可能的原因是你的搜索结果已经失效(过时了)。Chrome浏览器可能会显示缓存中的数据,你可以尝试刷新一下页面,看看结果是否还在。
另外,网页可能需要之前保存的一个小文件(叫做cookie)。

0

可能你的问题和 cookies 有关。巧合的是,我通常在不需要 JavaScript 或 cookies 的网站上浏览网页,所以我在这种情况下点击了链接。

在没有启用 JavaScript、cookies 和 Referer 信息的情况下,我得到了一个 404 页面。然后我启用了这些功能,结果出现了一个“搜索过期”的页面。为了验证我的想法,我再次启用了 JavaScript 和 Referer,然后点击了链接,结果又回到了 404 页面。

所以,建议你使用 HTTPCookieProcessor 来创建一个打开器,这样问题应该就能解决了。

祝好

撰写回答