2010-06-21 43 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秒規則,爬行意志的速度取決於後臺的機器,它將提供並行抓取單一目標。