我需要抓一个简单的网页,其中包含以下文字:
值= 29 时间= 128769
值经常变化。
我想提取Value(在本例中为29)并将其存储在数据库中。我想每6个小时刮一次这个页面。我对在任何地方显示价值都不感兴趣,我只对cron感兴趣。希望我有道理。
请告诉我是否可以使用Google的App Engine完成此操作。
谢谢!
答案 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
作为异常时的值,但你可能想做更多...或更少 - 我会把它留给你! - )