2016-05-09 109 views
1

我可能會用錯誤的術語來說這個,所以如果我錯了,請糾正。javascript執行後從DOM獲取html

這是我想要做的:我試圖抓取一個網站的評論部分,但評論是在頁面完全加載後通過ajax調用加載的。當我嘗試通過以下網址從網站上刮取HTML時:

res, err:= http.Get(url) 
if err != nil { 
    // handle error 
} 
defer res.Body.Close() 

但是它顯然在ajax調用之前獲取了html。如何在ajax調用後獲取html?

這完全是我的頭頂,但我需要基本上在這個代碼中創建一個js渲染器?我的猜測是JS需要以某種方式執行。任何關於如何去做這件事的建議/圖書館/例子?我寧願這樣做,但它可以用任何語言寫實。

+5

這是永遠不會工作。我不會深究它,但Go http客戶端不是瀏覽器。當頁面加載到瀏覽器中時,瀏覽器解析腳本並執行它們,這在這裏不會發生。如果你想刮一個頁面,最好使用Selinium之類的東西,這個東西是用於網絡用戶界面自動化的。另一種選擇是一個名爲phantomjs的工具,它的功能相同,但在這種情況下,腳本不會執行。最重要的是,你需要使用JavaScript。您需要掛鉤頁面加載並在完成後運行callbakc。 – evanmcdonnal

+0

廢棄註釋部分,直接調用ajax網址加載評論,然後您將收到評論。 你有一個網站的例子來看看? – OscarRyz

回答

0

如果您擁有該網站或者可以輕鬆確定(或生成)加載註釋的調用的URI,則自己完成相同的AJAX調用可能會更容易,而不必擔心DOM解析或任意JS執行。

在這一點上,Go實際上是一種很好的語言,因爲它的JSON和XML標準庫非常適合解編這類數據。

2

你可以使用像http://phantomjs.org/這樣的無頭瀏覽器來獲取頁面,在其上執行所有的javascript並且刪除評論。 這個例子可以幫助:https://github.com/ariya/phantomjs/blob/master/examples/phantomwebintro.js

但是phantomjs是單獨的二進制應用程序,也許安裝它可能不是那麼平凡。

此外,您可以使用Firebug研究該頁面,查看正在發送的請求以獲取評論,並在進行中模擬此調用。

也許通過這樣的

$.get("/ajax/comments", function(data) { 
    $(".comments").html(data); 
}); 

JavaScript代碼的頁面加載意見,以便您可以獲取並使用去

1

最近解析/ajax/comments頁面我有同樣的問題和GoQuery幫助了很多 我試着第一個網站來自網絡,JS事件加載了評論,並給你寫了一小段代碼。你可以試試看看。

doc,_ := goquery.NewDocument("http://www.ihg.com/holidayinn/hotels/us/en/san-francisco/sfocc/hoteldetail/hotel-reviews?scmisc=hotel_details_reviews_link_bottom") 
html_contents,_ := doc.Html() 
fmt.Println(html_contents) 

這將最初顯示頁面主要內容下的所有評論,這些評論是由JS事件加載的。

祝你好運!