Использование службы Cron Google App Engine для извлечения данных из URL - PullRequest
0 голосов
/ 20 декабря 2009

Мне нужно почистить простую веб-страницу со следующим текстом:

Значение = 29 Время = 128769

Значения часто меняются.

Я хочу извлечь значение (в данном случае 29) и сохранить его в базе данных. Я хочу почистить эту страницу каждые 6 часов. Меня нигде не интересует отображение значения, мне просто интересен cron. Надеюсь, я понял.

Пожалуйста, сообщите мне, если я смогу сделать это, используя Google App Engine.

Спасибо!

1 Ответ

2 голосов
/ 20 декабря 2009

Пожалуйста, сообщите мне, если я могу выполнить это с помощью Google App Engine.

Конечно! Например, в Python urlfetch (с URL-адресом в качестве аргумента), чтобы получить содержимое, затем простой re.search(r'Value=(\d+)').group(1) (если содержимое так же просто, как вы показываете), чтобы получить значение, и db.put для хранить его. Вы хотите, чтобы детали Python были прописаны, или вы предпочитаете Java?

Редактировать : urllib / urllib2 также возможен (GAE поддерживает их сейчас).

Так что cron.yaml должно быть что-то вроде:

cron:
- description: refresh "value"
  url: /refvalue
  schedule: every 6 hours

и app.yaml что-то вроде:

application: valueref
version: 1
runtime: python
api_version: 1

handlers:
- url: /refvalue
  script: refvalue.py
  login: admin

Конечно, у вас могут быть и другие записи в одном или обоих, но это подмножество, необходимое для «обновления значения». Возможный refvalue.py может быть:

import re
import wsgiref.handlers

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.api import urlfetch

class Value(db.Model):
  thevalue = db.IntegerProperty()
  when = db.DateTimeProperty(auto_now_add=True)

class RefValueHandler(webapp.RequestHandler):
  def get(self):
    resp = urlfetch.fetch('http://whatever.example.com')
    mo = re.match(r'Value=(\d+)', resp.content)
    if mo:
      val = int(mo.group(1))
    else:
      val = None
    valobj = Value(thevalue=val)
    valobj.put()

def main():
  application = webapp.WSGIApplication(
    [('/refvalue', RefValueHandler),], debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()

В зависимости от того, что еще делает ваше веб-приложение, вы, вероятно, захотите переместить class Value в отдельный файл (например, models.py с другими моделями), который, конечно, затем придется импортировать (из этого .py файл и другие, которые делают что-то интересное со всеми вашими сохраненными значениями). Здесь я принял во внимание некоторые возможные аномалии (на целевой странице не найдено Value=), но не другие (сервер целевой страницы не отвечает или выдает ошибку); Трудно точно знать, какие аномалии вам нужно учитывать и что вы хотите делать, если они возникают (я здесь просто записываю None в качестве значения во время аномалии, но вы, возможно, захотите сделать больше. .. или меньше - я оставлю это на ваше усмотрение! -)

...