为什么部署后谷歌应用引擎中出现500服务器错误?

时间:2014-10-26 14:49:09

标签: python google-app-engine web-crawler

我的脚本在Google应用引擎的localhost上运行完美,但在部署脚本时会在云端显示以下错误(appspot.com):

"错误:服务器错误

服务器遇到错误,无法完成您的请求 请在30秒后再试一次。"

这是我的代码:

import webapp2
import sys
sys.path.insert(0, 'libs')
import requests
from bs4 import *
import re
import smtplib
from google.appengine.api import urlfetch
from google.appengine import runtime

class MainHandler(webapp2.RequestHandler):
  def get(self):
    self.response.write("hello")

    #urlfetch.set_default_fetch_deadline(60)

  def spider():
    count = 1
    href = 'www.example.com'
    while count <= 2:
      new_url = href
      new_source_code = urlfetch.fetch(new_url, deadline=60)
      new_plain_text = new_source_code.content
      new_soup = BeautifulSoup(new_plain_text)
      for new_link in new_soup.find_all('table'):
        for new_link1 in new_link.find_all('a'):
          new_href = 'www.example.com' + new_link1.get('href')
          new1_url = new_href
          new1_source_code = urlfetch.fetch(new1_url, deadline=60)
          new1_plain_text = new1_source_code.content
          new1_soup = BeautifulSoup(new1_plain_text)
          for new1_link in new1_soup.find_all('tbody'):
            for new1_link1 in new1_link.find_all('a', attrs={'class': 'title'}):
              new1_title = new1_link1.string
              new1_title = new1_title.strip()
              new1_href = 'www.example.com' + new1_link1.get('href')
              self.response.write(new1_title)
              self.response.write(new1_href)
    count = count + 1

  spider()

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

我只是想通过抓取来打印网址,我可以在部署后看到本地主机上的网址而不是应用引擎上的网址,这显示我的错误。

2 个答案:

答案 0 :(得分:2)

对于自动缩放App Engine模块,截止日期为60秒。在您的示例代码中,您有两个URL获取请求,每个请求都在一个循环中,每个请求的截止时间为60秒。假设您没有运行基本扩展或手动扩展实例,您可能会发现在60秒后您看到此异常。即使远程主机上的一次超时也会导致您超出前端截止日期。

This page将为您提供不同实例缩放类型的截止日期。

但是,您可能希望使用任务队列来帮助将工作分解为可管理的“可重试”块。

答案 1 :(得分:2)

Google App Engine中的每个请求的最高硬限制为60秒,因此,如果长度超过此值,您将获得DeadlineExceededError

如果你知道你要求的前期需要花费更多时间,那么你将不得不使用Tasks API来运行长达10分钟的事情。最后,如果你想要更长的东西,可以查看Backends API,你可以运行24小时。