urllib2.urlopen()使用GAE在特定URL上返回错误500

时间:2011-12-10 17:43:56

标签: python google-app-engine

我在GAE上的特定网址上使用urllib2.urlopen时遇到问题。当我在使用Eclipse时运行相同的代码时,我能够检索网站数据,但是当我尝试使用GAE实现时,我得到“状态500内部服务器错误”。

在普通的Python应用程序中,我有以下代码可以正常工作。

query2 = {'ORIGIN': 'LOS','DESTINATION':'ABV', 'DAY':'23',
          'MONTHYEAR': 'JAN2012', 'RDAY': '-1', 'RMONTHYER': '-1',
          'ADULTS': '1', 'KIDS': '0', 'INFANTS': '0', 'CURRENCY': 'NGN',
          'DIRECTION': 'SEARCH', 'AGENT': '111210135256.41.138.183.192.29025'}

encoded = urllib.urlencode(query2)
url3 = 'http://www.flyaero.com/cgi-bin/airkiosk/I7/171015'
request = urllib2.urlopen(url3, encoded)

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

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

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

这很好用,但是对于GAE,它没有。这是GAE代码:

class MainPage(webapp.RequestHandler):
    def get(self):      
        query = {'ORIGIN': 'LOS','DESTINATION':'ABV', 'DAY':'23',
                 'MONTHYEAR': 'JAN2012', 'RDAY': '-1', 'RMONTHYER': '-1',
                 'ADULTS': '1', 'KIDS': '0', 'INFANTS': '0', 'CURRENCY': 'NGN',
                 'DIRECTION': 'SEARCH', 'AGENT': '111210135256.41.138.183.192.29025'}

        urlkey = 'http://www.flyaero.com/cgi-bin/airkiosk/I7/181002i?AJ=2&LANG=EN'
        urlsearch = 'http://www.flyaero.com/cgi-bin/airkiosk/I7/171015'
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        header = { 'User-Agent' : user_agent }

        try:
            request = urllib2.urlopen(urlkey)
            data = request.read()
            info = request.info()
        except urllib2.URLError, e:
            print 'error code: ', e

        print 'INFO:'
        print info  
        print ''        
        print 'Old key is: ' + query['AGENT']

        print 'Agent key is  ' + query['AGENT']
        encoded = urllib.urlencode(query)
        print 'encoded data', encoded
        print ''
        print 'web data'
        print''

        try:
            request2 = urllib2.urlopen(urlsearch, encoded)
            data2 = request2.read()
            info2 = request2.info()
        except urllib2.URLError, e:
            print 'error code: ', e

        print 'INFO:'
        print info2
        print ''
        print 'DATA: '
        print data

有两次调用urllib2.urlopen。第一个工作,但第二个返回错误500,try-except块没有捕获它。

这是request.info()命令打印出来的消息

Status: 500 Internal Server Error
Content-Type: text/html; charset=utf-8
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Content-Length: 1662

我不在开发者服务器上,我正在使用eclipse开发,并在我的系统上从localhost运行。这是在浏览器和eclipse控制台上显示的错误消息,这是消息:

    WARNING  2011-12-10 17:29:31,703 urlfetch_stub.py:405] Stripped prohibited headers from   URLFetch request: ['Host']
    WARNING  2011-12-10 17:29:33,075 urlfetch_stub.py:405] Stripped prohibited headers from      URLFetch request: ['Content-Length', 'Host']
    ERROR    2011-12-10 17:29:38,305 __init__.py:463] ApplicationError: 2 timed out
    <pre>Traceback (most recent call last):

  File &quot;C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\__init__.py&quot;, line 700, in __call__

handler.get(*groups)

  File &quot;C:\Users\TIOLUWA\Documents\CODES\Elipse\FlightShop\flightshop.py&quot;, line 124, in get

    request2 = urllib2.urlopen(urlsearch, encoded)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 124, in urlopen

    return _opener.open(url, data)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 381, in open

    response = self._open(req, data)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 399, in _open
    '_open', req)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 360, in _call_chain

    result = func(*args)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 1107, in http_open

    return self.do_open(httplib.HTTPConnection, req)

  File &quot;C:\python25\lib\urllib2.py&quot;, line 1080, in do_open

    r = h.getresponse()

  File &quot;C:\Program Files (x86)\Google\google_appengine\google\appengine\dist\httplib.py&quot;, line 213, in getresponse

    self._allow_truncated, self._follow_redirects)

  File &quot;C:\Program Files (x86)\Google\google_appengine\google\appengine\api\urlfetch.py&quot;, line 260, in fetch

    return rpc.get_result()

  File &quot;C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apiproxy_stub_map.py&quot;, line 592, in get_result

    return self.__get_result_hook(self)

  File &quot;C:\Program Files (x86)\Google\google_appengine\google\appengine\api\urlfetch.py&quot;, line 358, in _get_fetch_result

    raise DownloadError(str(err))

    DownloadError: ApplicationError: 2 timed out

1 个答案:

答案 0 :(得分:0)

如异常所示,由于传出的HTTP请求超时,它失败了。不要使用urllib2,而是直接使用URLFetch,并将deadline参数传递给fetch函数,并将期限延长。