2011-09-07 71 views
1

我試圖從Facebook帳戶設置頁面抓取信息,以便爲Facebook會員提供反饋的瀏覽器應用程序。我想閱讀幾個頁面,並使用jQuery進行刮擦而不顯示頁面。不幸的是,我無法使用我嘗試過的三種方法中的兩種來使Facebook的BigPipe代碼作爲頁面加載的一部分運行。調用Facebook的BigPipe onPageletArrive腳本

下面的第三種方法似乎可行,但我仍然想知道爲什麼其他兩個失敗。有沒有辦法觸發BigPipe onPageletArrival腳本使用jQuery .load()方法或document.implementation.CreateDocument運行?

更新:我沒有像我應該那樣簡潔地提出核心問題:如何獲得前兩種方法的行爲與iFrame方法相同?換句話說:當我開始使用嘗試1或2時,如何讓BigPipe腳本執行並填充內容?

嘗試1(使用document.implementation.createDocument):

html = getHttpPage('http://www.facebook.com/editprofile.php?sk=basic'); 
var fbPageHdr = /^<!DOCTYPE html><html[^>]+>/, 
     fbPageTail = /<\/html>/; 

var dt = document.implementation.createDocumentType("html", "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd"); 
var doc = document.implementation.createDocument('','', dt); 

var htmlElem = doc.createElement('html'); 
html = html.replace(fbPageHdr, ""); 
html = html.replace(fbPageTail, ""); 
htmlElem.innerHTML = html; 
doc.appendChild(htmlElem); 

嘗試2(使用jQuery .load()方法):

var $njqNode = $(); 
$njqNode.load('http://www.facebook.com/editprofile.php?sk=basic' + ' body'); 

嘗試3 - 這一個工程! (使用jQuery和iFrame):

if ($('#hiddenpage').length == 0){ 
    var $hiddenPage = $('<iframe id="hiddenpage" width="1000px" height="1000px"></iframe>'); 
    $('body').append($hiddenPage); 
} 
$('#hiddenpage').attr('src', 'http://www.facebook.com/editprofile.php?sk=basic'); 

回答

2

BigPipe會打印一個靜態標題並保持HTTP連接處於打開狀態。通過附加javascript標籤,可以將其他內容亂序添加到文檔中。前兩種方法不起作用,因爲它們只抓取頁面的平面內容(這是相當不起眼的),並且不對它執行BigPipe文檔修改腳本。

最後一種方法確實是工作,因爲它的行爲像一個新的瀏覽器窗口。

+0

有沒有辦法使用前兩種方法觸發頁面更新以獲取完整內容? – user933318

+0

毫不嘲笑一種新的瀏覽器環境,這在理論上是可行的,但對您的使用可能不切實際。使用iframe有什麼問題嗎? –

+1

我想把這個項目變成一個更通用的刮板工具。不幸的是,對於這種用法,許多網站不希望在iFrame中顯示。他們反對將他們的內容嵌入其他網站。快速搜索中有幾篇文章描述瞭如何檢測頁面是否位於iFrame中,以及如何消除頁面。 – user933318