2009-12-19 4 views
0

je dois gratter une page Web simple qui a le texte suivant:En utilisant le service de Google App Engine Cron pour extraire des données à partir d'une URL

Valeur = 29 Temps = 128769

Les valeurs changent fréquemment.

Je veux extraire la valeur (29 dans ce cas) et la stocker dans une base de données. Je veux gratter cette page toutes les 6 heures. Je ne suis pas intéressé à afficher la valeur n'importe où, je suis juste intéressé par le cron. J'espère que j'ai fait sens.

S'il vous plaît informez-moi si je peux accomplir cela en utilisant App Engine de Google.

Merci!

Répondre

2

S'il vous plaît informez-moi si je peux accomplir cela en utilisant Google App Engine.

Sûr! Par exemple, en Python, urlfetch (avec l'URL comme argument) pour obtenir le contenu, puis un simple re.search(r'Value=(\d+)').group(1) (si le contenu est aussi simple que vous le montrez) pour obtenir la valeur, et un db.put pour le stocker. Voulez-vous que les détails de Python soient épelés, ou préférez-vous Java?

Modifier: urllib/urllib2 serait également réalisable (GAE les supporte maintenant).

Alors cron.yaml devrait être quelque chose comme:

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

et app.yaml quelque chose comme:

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

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

Vous avez sans doute d'autres entrées dans l'une ou les deux, bien sûr, mais c'est le sous-ensemble nécessaire pour "rafraîchir la valeur". Une possible refvalue.py peut-être:

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() 

Selon ce que le reste de votre application web est en train de faire, vous aurez probablement envie de déplacer le class Value dans un fichier séparé (par exemple models.py avec d'autres modèles) qui bien sûr vous aurez alors avoir à importer (à partir de ce fichier .py et d'autres qui font quelque chose d'intéressant avec toutes vos valeurs sauvegardées). Ici, j'ai pris en compte certaines anomalies possibles (pas de Value= trouvé sur la page cible) mais pas d'autres (le serveur de la page cible ne répond pas ou donne une erreur); il est difficile de savoir exactement quelles anomalies vous devez considérer et ce que vous voulez faire si elles se produisent (ce que je fais ici est très simplement l'enregistrement None comme la valeur à l'heure de l'anomalie, mais vous voudrez peut-être faire plus ... ou moins - je vous laisse le soin de le faire! -)

+0

Je suis intéressé par la version Python, merci! J'essayais d'utiliser urllib2, httplib2. SO urlfetch est le chemin à parcourir, n'est-ce pas? Le contenu est vraiment simple. Variables uniques contenant des valeurs dynamiques Valeur = 29 Temps = 128769 a = 39 b = 129 c = 9 d = 12 e = 29 f = 659 g = 279 h = 5769 i = 43 k = 128 j = 29 l = 769 m = 29 n = 187 Donc, les importations doivent être re et la bibliothèque urlfetch, n'est-ce pas? Je suis tellement désolé, je suis un débutant Python, je souhaite Google App moteur pris en charge plus de langues ou mieux encore un accès au terminal Linux! – ThinkCode

+0

@NJTechGuy, GAE supporte Java (et indirectement à travers de nombreuses langues qui peuvent être implémentées sur Java, comme JRuby, Scala, Groovy, Clojure - voir http://groups.google.com/group/google- appengine-java/web/moteur de jeu-dans-l'application pour une liste de plus de 8 langues connues pour fonctionner sur App Engine ... êtes-vous * en train de dire * sérieusement que ces langues RTE-plus ne suffisent pas? et cela vous limite vraiment?! -). Aucune idée de ce que signifie "l'accès au terminal Linux" dans ce contexte. Quoi qu'il en soit, édité la réponse pour inclure une solution complète. –

+0

Oh mon dieu Alex! Tu es un génie! Donc, beaucoup de forums détestent aider les débutants. Vous m'avez fourni une solution complète! Je n'ai pas encore testé, mais je suis sûr que ça va marcher :) Je n'ai jamais aimé Java :(C# préféré à l'époque, on dirait que je dois gagner du terrain sur Java, continue d'en entendre parler! J'adorerais PERL compatibilité sur GAE Je suis un peu nouveau dans le monde open source, je l'adore déjà! Avec des sites comme ceux-ci, je devrais être au top en un rien de temps! Merci beaucoup :) – ThinkCode

Questions connexes