У меня есть скрипт в 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 завершилась неудачно.
напишите свой код, возможно, что-то не так. Отправлены ли эти отладочные сообщения в обработчик задания cron? – marcadian
Отладочные сообщения печатаются в журнале gae, онлайн. Это происходит только в режиме онлайн, в собственном облаке Google. На моей машине он работает без каких-либо предупреждений или отладок. – memius
HOw вы знаете, что он не запускается, журнал подсказывает, что что-то начинается. Но, вероятно, не работает до завершения. Я бы посоветовал вам добавить больше протоколов, чтобы узнать, как далеко продвинулся процесс. –