2010-06-21 95 views
5

我想在appengine上连续运行一个程序。这个程序会自动抓取一些网站并将数据存储到它的数据库中。是否有可能让程序继续在appengine上继续执行?或者将appengine杀死进程?在appengine上的履带

注:将被抓取该网站没有存储在AppEngine上

+0

的[AppEngine上后台任务(http://stackoverflow.com/questions/149307/background-tasks-on-appengine) – 2010-06-21 19:40:31

回答

8

我希望AppEngine上continiously 运行的程序。

不能。

你可以得到最接近的是后台运行scheduled tasks,去年no more than 30 seconds

值得注意的是,这意味着单个任务的执行生存期 是 限制为30秒。如果您的任务 执行时间接近30秒限制,则 App Engine将引发异常 ,您可能会捕获该异常,然后快速 保存您的工作或日志进程。

+2

1到这种可能的重复。您可以安排任务在网站上定期运行,这应该足够了,但您无法连续抓取网页。如果该页面支持PubSubHubBub(http://code.google.com/p/pubsubhubbub/)或其他推送技术,则可以让您的应用程序订阅更新并在页面实际更改时进行抓取。 – 2010-06-21 19:40:30

+0

对于爬行,我认为任务队列比单个守护进程更有效。它为你处理并行性,任务模型非常适合爬行。 – 2010-06-22 07:57:01

+0

@请问后端怎么样? – Michael 2011-07-11 01:22:54

0

你不能从字面上运行一个连续的过程超过30秒。但是,您可以使用任务队列让一个进程调用连续链中的另一个进程。或者,您可以安排工作与Cron服务一起运行。

0

使用cron作业来定期检查过去n小时/天/无论何时未被抓取的页面,并将这些页面的某些子集的抓取任务放到任务队列中。这样,你的流程不会因为花费太长时间而被杀死,而且你不会因为流量过大而捣乱你所刮的服务器。

我已经完成了这个工作,它工作得很好。注意任务超时;如果事情花费太长时间,请将它们分成多个阶段,并确保使用memcached。

2

我的一个朋友建议下

  • 通过传递一些数据来创建一个task queue
  • 开始排队。
  • 使用异常处理程序并处理DeadlineExceededException。
  • 在您的处理程序中为同一目的创建一个新队列。

你可以无限地运行你的工作。您只需考虑使用的CPU时间和存储。

0

试试这个:

在appengine上运行任何程序。你从浏览器连接,在ajax期间点击开始url。 Ajax呼叫服务器,从互联网下载一些数据并返回给您(您的浏览器)下一个网址。这不是一个请求,每个url都是一个不同的请求。您只能在JS中解析ajax如何调用url un cycle。

0

您可以使用称为后端的历史GAE服务。检查此http://code.google.com/appengine/docs/java/backends/ 后端是特殊的App Engine实例,它们没有请求最后期限,更高的内存和CPU限制以及跨请求的持久状态。它们由App Engine自动启动,并可以长时间连续运行。每个后端实例都有一个唯一的URL用于请求,并且可以跨多个实例负载平衡请求。

1

您可能会考虑在较新版本的GAE中引入Backends。

这些运行的连续过程

1

是可能,我已经建立在AppEngine上的解决方案 - wowprice

共享所有的细节在这里会让我的回答冗长,

问题 -假设我想抓取walmart.com,因为我知道我不能一次抓取(百万产品)

解决方案 -我设计了我的蜘蛛来打破小任务中的任务。

  • 第1步:我输入walmart.com的作业,Job scheduler将创建一个任务。
  • 第2步:我的蜘蛛会选择工作,其公告称,其索引页,现在我的蜘蛛会创造更多的就业机会作为起始页面的分类页面,现在它进入20多个任务
  • 第3步:现在蜘蛛做出更多为子类别提供较小的作业,它将一直持续到产品列表页面并为其创建任务。
  • 第4步:对于产品列表页面,其获取产品并调用以存储产品数据,并在下一页的情况下将执行一项任务以抓取它们。

优势 - 我们可以爬在不破坏30秒规则,爬行意志的速度取决于后台的机器,它将提供并行抓取单一目标。