2011-12-09 89 views
1

我想填写一个表格,使用python程序,它适用于某些网站,但不是这个特定的,我不知道为什么。urllib2.urlopen()返回不同的结果

这是一小段代码片段

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 

这一切工作正常,但结果我得到的是,如果我直接输入完整的网址在Web浏览器不显示的内容,这给了我正确的结果。

我不确定什么问题可以帮助我吗?

+1

这一请求似乎并没有为我工作。这是代码运行时'''url'''的值:[link](http://www.wakanow.com/ng/flights/SearchProcess.aspx?retYear=2011&airlinePref=&adults=1&searchType=D&retDay=11&retMonth = 12&arrvTime =&arrvCode = ABV&deptDay = 10&跳闸= RT&deptMonth = 12&货币= NGN&DEPTCODE = LOS&deptYear = 2011&婴儿= 0&deptTime =&孩子= 0&舱= E)。它只是挂起。 (其实我似乎无法连接到该网站。) – FakeRainBrigand

回答

1

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

使用encoded无论是在URL(GET)或dataurllib2.RequestPOST)不同时,即,

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) 
+0

对不起,我不太了解你。我应该直接使用urllib2.urlopen(url)吗? – TiOLUWA

+0

'urllib2.urlopen(url)'不允许您发送标题。所以如果你不需要/需要请求中的头文件,请继续,否则,请检查我的答案,它有你需要使用的东西。 –

+0

@TiOLUWA:我已经为答案添加了conrecte示例。 – jfs

2

你很可能在做GET在您的浏览器中,但在您的代码中,您实际上是通过将POST指定为带有查询数据的网址,并将查询数据作为POST数据。你可能只想做一个GET。从this page

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

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

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

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

0

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

而且你可以考虑用超时控制这样的:

import urllib,urllib2,socket 

timeout = 10 
socket.setdefaulttimeout(timeout) 
+0

我认为该网站已关闭,我甚至无法直接从我的浏览器直接访问该网站。 – TiOLUWA

+0

是的,我也没有 – soField