【问题标题】:Using Google App Engine's Cron service to extract data from a URL使用 Google App Engine Cron 服务从 URL 中提取数据
【发布时间】:2010-01-01 23:40:23
【问题描述】:

我需要抓取一个包含以下文本的简单网页:

值=29 时间=128769

值经常变化。

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

如果我可以使用 Google 的 App Engine 完成此操作,请告知我。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果我能完成,请告诉我 使用 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 记录为异常时的值,但您可能想要做更多。 .. 或更少——我将把它留给你!-)

    【讨论】:

    • 我对Python版本感兴趣,谢谢!我试图使用 urllib2、httplib2。所以 urlfetch 是要走的路吗?内容真的很简单。具有动态值的唯一变量。值=29 时间=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 所以,导入应该是 re 和 urlfetch 库,是吗?非常抱歉,我是 Python 新手,希望 Google App 引擎支持更多语言或更好地访问 Linux 终端!
    • @NJTechGuy,GAE 确实支持 Java(并且间接地通过可以在 Java 之上实现的许多语言,例如 JRuby、Scala、Groovy、Clojure - 请参阅 groups.google.com/group/google-appengine-java/web/… 以获取已知在 App Engine 上运行的语言超过 8 种......您是否认真说那些超过 10 种语言还不够,这真的限制了您?!-)。不知道在这种情况下“访问 Linux 终端”是什么意思。无论如何,编辑答案以包含完整的解决方案。
    • 天哪,亚历克斯!你是个天才!那里有很多论坛讨厌帮助新手。您为我提供了完整的解决方案!我还没有测试它,但我相信它会工作 :) 我从不喜欢 Java :( 那时首选 C#。看起来我必须在 Java 上取得一些基础,继续听到很多关于它的消息!我会喜欢 PERL 兼容性GAE。我对开源世界有点陌生,我已经喜欢它了!有了这样的网站,我应该很快就会成为顶级!非常感谢 :)
    • p.s:有没有办法在发布/编辑答案时立即收到警报?每日摘要有效,但即时警报会很棒!只是一个想法!
    • 我相信你可以设置RSS提要,但我个人没有这样做;查看 meta.stackoverflow.com。
    猜你喜欢
    • 2018-05-11
    • 2011-09-16
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2011-02-15
    • 2014-04-13
    • 2014-03-02
    • 2023-03-14
    相关资源
    最近更新 更多