2013-07-23 2 views
0

У меня есть скрипт в Google Appengine, который запускается каждые 20 минут cron.yaml. Это работает локально, на моей собственной машине. Когда я иду (вручную) на url, который запускает скрипт онлайн, он также работает. Тем не менее, сценарий всегда не удается завершить онлайн, в случаях Google, когда cron.yaml отвечает за его запуск.cron job failed in gae python

Журнал не показывает никаких ошибок, только 2 отладочных сообщений:

D 2013-07-23 06:00:08.449 
type(soup): <class 'bs4.BeautifulSoup'> END type(soup) 

D 2013-07-23 06:00:11.246 
type(soup): <class 'bs4.BeautifulSoup'> END type(soup) 

Вот мой сценарий:

# coding: utf-8 
import jinja2, webapp2, urllib2, re 

from bs4 import BeautifulSoup as bs 
from google.appengine.api import memcache 
from google.appengine.ext import db 

class Article(db.Model): 
    content = db.TextProperty() 
    datetime = db.DateTimeProperty(auto_now_add=True) 
    companies = db.ListProperty(db.Key) 
    url = db.StringProperty() 

class Company(db.Model): 
    name = db.StringProperty() 
    ticker = db.StringProperty() 

    @property 
    def articles(self): 
     return Article.gql("WHERE companies = :1", self.key()) 

def companies_key(companies_name=None): 
    return db.Key.from_path('Companies', companies_name or 'default_companies') 

def articles_key(articles_name=None): 
    return db.Key.from_path('Articles', articles_name or 'default_articles') 

def scrape(): 
    companies = memcache.get("companies") 
    if not companies: 
     companies = Company.all() 
     memcache.add("companies",companies,30) 
    for company in companies: 
     links = links(company.ticker) 
     links = set(links) 
     for link in links: 
      if link is not "None": 
       article_object = Article() 
       text = fetch(link)    
       article_object.content = text 
       article_object.url = link 
       article_object.companies.append(company.key()) #doesn't work. 
       article_object.put() 

def fetch(link): 
    try: 
     html = urllib2.urlopen(url).read() 
     soup = bs(html) 
    except: 
     return "None" 
    text = soup.get_text() 
    text = text.encode('utf-8') 
    text = text.decode('utf-8') 
    text = unicode(text) 
    if text is not "None": 
     return text 
    else: 
     return "None" 


def links(ticker): 
    url = "https://www.google.com/finance/company_news?q=NASDAQ:" + ticker + "&start=10&num=10" 
    html = urllib2.urlopen(url).read() 
    soup = bs(html) 
    div_class = re.compile("^g-section.*") 
    divs = soup.find_all("div", {"class" : div_class}) 
    links = [] 
    for div in divs: 
     a = unicode(div.find('a', attrs={'href': re.compile("^http://")})) 
     link_regex = re.search("(http://.*?)\"",a) 
     try: 
      link = link_regex.group(1) 
      soup = bs(link) 
      link = soup.get_text() 
     except: 
      link = "None" 
     links.append(link) 

    return links 

... и обработчик скрипта в основном:

class ScrapeHandler(webapp2.RequestHandler): 
    def get(self): 
     scrape.scrape() 
     self.redirect("/") 

Я предполагаю, что проблема может быть двойным циклом в скрипте scrape, но я не понимаю, почему именно.

Обновление: Статьи действительно быть Царапины (столько же, сколько и должно быть), а теперь нет ошибок в журнале, или даже отладочные сообщения на всех. Глядя на журнал, работа cron казалась безупречной. Тем не менее, панель заданий cron в Appengine говорит, что работа cron завершилась неудачно.

+0

напишите свой код, возможно, что-то не так. Отправлены ли эти отладочные сообщения в обработчик задания cron? – marcadian

+0

Отладочные сообщения печатаются в журнале gae, онлайн. Это происходит только в режиме онлайн, в собственном облаке Google. На моей машине он работает без каких-либо предупреждений или отладок. – memius

+0

HOw вы знаете, что он не запускается, журнал подсказывает, что что-то начинается. Но, вероятно, не работает до завершения. Я бы посоветовал вам добавить больше протоколов, чтобы узнать, как далеко продвинулся процесс. –

ответ

0

Я уверен, что эта ошибка возникла из-за DeadlineExceededError, с которой я не столкнулся локально. Мой скрипт scrape() теперь делает все возможное для меньшего количества компаний и статей и не превзойдены предельным сроком.