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

时间:2011-12-09 19:37:11

标签: python

我正在尝试使用python程序填写表单,它适用于某些网站,但不是这个特定的网站,我不知道为什么。

这是代码snipet

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 :(得分:2)

您可能在浏览器中执行了GET,但在您的代码中,您实际上正在使用查询数据对您的POST网址进行POST,并将您的查询数据作为{{ 1}}数据。你可能只想做一个GET。来自this page

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

  

数据可以是指定要发送到服务器的其他数据的字符串,如果不需要这样的数据,则为None。目前,HTTP请求是唯一使用数据的请求;提供数据参数时,HTTP请求将是POST而不是GET。数据应该是标准application / x-www-form-urlencoded格式的缓冲区。 urllib.urlencode()函数采用2元组的映射或序列,并以此格式返回一个字符串。

所以,你真正想要的是:

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

答案 1 :(得分:1)

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

encodedGET)的网址(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 :(得分:0)

此网址挂起。尝试使用不太重的搜索字符串。

你可以考虑用超时控制它:

import urllib,urllib2,socket

timeout = 10
socket.setdefaulttimeout(timeout)