2015-01-17 43 views
2

我有一個PHP腳本,它使用PhantomJS來抓取網頁並將抓取的數據插入到數據庫中。
目前,在PhantomJS的資源超時中,我取消了頁面的整個請求,並通過PHP再次請求整個頁面。
這裏是我的代碼:如何在PhantomJS資源超時重新發送請求?

page.settings.resourceTimeout = 5000; // 5 seconds 
page.onResourceTimeout = function(e) { 
    console.log(e.errorCode); // it'll probably be 408 
    console.log(e.errorString); // it'll probably be 'Network timeout on resource' 
    console.log(e.url);   // the url whose request timed out 
    phantom.exit(1); 
}; 

我只想重新發送到超時資源的請求,而不是從頭再來請求整個頁面。 這可能嗎?

+0

我一直在使用[Spiderling](https://github.com/OpenBuildings/spiderling)最近從PHP驅動PhantomJS。我想知道是否有一些事情可以確定依賴資源是否成功加載,以及它們不在哪裏,重新加載它們(我相信有一個JS加載器)。然而,正如Artjom所說,由於後來的腳本可能由於初始故障而失敗,因此您可能必須在故障發生後(包括)重新加載所有腳本。 – halfer

回答

0

您可以重新發送(GET)請求,但這對您沒有多大幫助,因爲請求的原因不同。

資源請求例如在<script>標記中引用JavaScript文件時自動發生。您可以使用PhantomJS通過XHR下載它,但很可能其他依賴於它的腳本已經嘗試運行並失敗。你將不得不重新運行所有的人。這真是很乏味。
像CSS文件或圖像的其他資源不是那種時間敏感,可以重新下載。但是當你這樣做時,你必須將它們插入到正確的位置。以CSS文件爲例。

  1. 您可以檢測,這是從請求頭或URL中的CSS資源,
  2. 檢查DOM的資源實際上是引用,
  3. 複製其所有屬性的DOM節點(和innerHTML)到一個新的DOM節點,
  4. 刪除舊的並插入新的節點。沒有什麼改變,但它應該提示瀏覽器再次下載資源。所有這些都必須在page.evaluate回調的頁面上下文中完成。

XHR請求明確通過該頁面發送。所以每個請求都有一個完成/錯誤回調。您無法從外部訪問這些回調,因此無法重新運行這些請求,因爲在這些請求之後發生的操作不會被調用。

您可能需要使用--disk-cache=true選項運行PhantomJS,以便再次運行頁面請求所需的時間更少。

+0

我明白了。那麼我應該在每次遇到依賴資源時都請求整個頁面? –

+0

是的。似乎沒有辦法繞過它。 –

+0

我爲第一部分添加了一個說明。 –

相關問題