我正在尝试使用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
这一切都运行正常,但如果我直接在网页浏览器中输入整个网址,我得到的结果就不会出现,这给了我正确的结果。
我不确定问题是什么,任何人都可以帮助我?
答案 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
个请求。
在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 :(得分:0)
此网址挂起。尝试使用不太重的搜索字符串。
你可以考虑用超时控制它:
import urllib,urllib2,socket
timeout = 10
socket.setdefaulttimeout(timeout)