使用Google App Engine Cron服务从URL中提取数据

时间:2009-12-19 23:33:53

标签: database google-app-engine screen-scraping cron

我需要抓一个简单的网页,其中包含以下文字:

值= 29 时间= 128769

值经常变化。

我想提取Value(在本例中为29)并将其存储在数据库中。我想每6个小时刮一次这个页面。我对在任何地方显示价值都不感兴趣,我只对cron感兴趣。希望我有道理。

请告诉我是否可以使用Google的App Engine完成此操作。

谢谢!

1 个答案:

答案 0 :(得分:2)

  

如果我能完成,请告诉我   这是使用谷歌的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作为异常时的值,但你可能想做更多...或更少 - 我会把它留给你! - )