urllib2.urlopen() 返回不同的结果

1 投票
3 回答
2189 浏览
提问于 2025-04-17 08:04

我正在尝试用一个Python程序填写一个表单,这个程序在一些网站上运行得很好,但在这个特定的网站上却不行,我也不太明白为什么。

这是我的代码片段:

query = {
'adults':'1',
'children':'0',
'infants':'0',
'trip':'RT',
'deptCode':'LOS',
'arrvCode':'ABV',
'searchType':'D',
'deptYear':'2011',
'deptMonth':'12',
'deptDay':'10',
'retYear':'2011',
'retMonth':'12',
'retDay':'11',
'cabin':'E',
'currency':'NGN',
'deptTime':'',
'arrvTime':'',
'airlinePref':''}

encoded = urllib.urlencode(query)



url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx?' + encoded
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(url, encoded, headers)

response = urllib2.urlopen(req)

print 'RESPONSE:', response
print 'URL     :', response.geturl()

headers = response.info()
print 'DATE    :', headers['date']
print 'HEADERS :'
print '---------'
print headers

data = response.read()
print 'LENGTH  :', len(data)
print 'DATA    :'
print '---------'
print data

一切看起来都正常,但我得到的结果和我直接在浏览器里输入完整网址时看到的结果不一样,后者是正确的。

我不太确定问题出在哪里,有人能帮我吗?

3 个回答

0

这个网址会卡住。试着用一个简单一点的搜索词。

你也可以考虑加一个超时控制,这样可以避免一直等下去:

import urllib,urllib2,socket

timeout = 10
socket.setdefaulttimeout(timeout)
1

如果你给 urllib2.Request 的第二个参数(data)提供了值,那么 urllib2.urlopen(req) 就会发送一个 POST 请求。

你可以选择在网址中使用 encoded(这叫 GET 请求),或者作为 data 放在 urllib2.Request 中(这叫 POST 请求),但不能同时使用,也就是说:

要么是 GET 请求:

url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx?' + encoded
req = urllib2.Request(url, headers=headers) #NOTE: no `encoded`

要么是 POST 请求:

url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx' #NOTE: no `encoded`
req = urllib2.Request(url, data=encoded, headers=headers)
2

你可能在浏览器里使用的是 GET 请求,但在你的代码中,其实是对一个网址做了 POST 请求,并且还带上了查询数据。你可能只是想用 GET 请求。根据这个页面

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

这里的data可以是一个字符串,用来指定要发送给服务器的额外数据,如果不需要这些数据,可以设置为None。目前,只有HTTP请求会使用到data;当提供了data参数时,HTTP请求就会变成POST,而不是GET。data应该是标准的application/x-www-form-urlencoded格式的缓冲区。你可以用urllib.urlencode()函数,它接受一个映射或一系列的二元组,并返回这种格式的字符串。

所以,你真正想要的应该是:

req = urllib2.Request(url, headers=headers)

撰写回答