有哪些go或c++框架可以完整模擬瀏覽器訪問網頁所涉及的全部元素?
非常感謝大家的熱心回答,大部分回答已經滿足我的需求了,只是我想知道更多一些方案,好從中選最合適的。
我再補充一下問題:
我的需求是在一個原有項目(GO)新增一個功能,這個功能
輸入:一個URL,例如 http://a.com/b.html
輸出:普通用戶訪問該URL將下載的所有元素的信息
例如:
b.html 的內容為:
&
&
document.getElementById("image").src="/i/d.jpg"
&
以上,4行內容
現在,我希望調用這個新功能 Printfln(NewFun("http://a.com/b.html")),會出現:
50ms 104B http://a.com/b.html httpcode200
66ms 100K http://a.com/i/c.jpg httpcode200(事實上c.jpg不會被下載)
99ms 200K http://a.com/i/d.jpg httpcode200
這樣的消息。對於圖片內容是一張美女圖還是阿貓阿狗不關心,可有可無,也沒有模擬網頁上的按鈕之類的需求
因為原項目是用go寫的,所以現在求的這個框架最好有go的實現,如果沒有,就C++的
這個項目是運行在小型linux下的(所以不考慮IE+插件),無界面,對程序尺寸要求最好能在10MB以下
現在已知c++ QT 是可行的,只是qt在linux還需要一堆依賴,所以QT先做為備選方案,再問問大家,還有沒有其它方案
===原問題============================
都知道例如 curl http://a.com/b.html 這樣只能訪問b.html這個網頁本身,如果這個頁面裡面涉及到圖片、js等其它資源是不會被curl訪問的
那麼問題是,有什麼框架或是引擎,能完整地模擬訪問url,能執行裡面的js、獲取圖片
優先考慮的語言:go、c++
如果你只是想獲得渲染結果,那很容易,弄一個IE11的ActiveX控制項,給個url然後等事件,幾行代碼就搞定了。
要完全模擬,只能用瀏覽器了。因為類似淘寶這類站點,登錄後頁面內容是不一樣的,登錄過程非常複雜,會對cookie加密,再發送給服務端驗證。你直接發http,不把加密cookies發送過去,只會得到錯誤提示頁面。
你可以編譯一個webkit來搞,或者直接用ie控制項,或者用electron、 PhathomJs ,甚至給chromium寫個插件,在插件里搞事情…各種方法都行。
C++的Qt可以,支持WebService、WebSocket、Http、SSL等。由於不是做互聯網的,對這塊不是很熟,但的確嘗試過使用新浪開發者API登陸新浪,成功獲取微博信息。再高級點,還有QWebEngine,其實就是內嵌chromium。當然也可以在windows下通過ActiveX內嵌ie
拿到訪問 a.html 的response (也就是HTML網頁內容)之後,查找其中的資源,然後再通過HTTP去下載。
類似 Joynet/SpiderZhihu.lua at master · IronsDu/Joynet · GitHub 訪問知乎某問題頁面,然後提取其中的圖片鏈接並下載。
Headless browser
你要解釋所有資源那不就是寫瀏覽器了
其實有些商業閉源框架用的方式很簡單粗暴,首先設定瀏覽器的proxy為自己寫的URL log service,然後直接調用瀏覽器訪問指定的url,這樣所有的request URL甚至cookie之類的東西就記錄完整了。原理簡單粗暴,但是做成產品會封裝的更精巧一些,比如像 @vczh說的用ActiveX完成瀏覽器引擎的活。手工玩的話,裝個fiddler之類的web debugger就可以了。
看看這個 https://github.com/PuerkitoBio/goquery/wiki/Tips-and-tricks#handle-javascript-based-pages
CasperJs可以解決你的問題。它封裝了PhantomJs更易用
為什麼不用瀏覽器執行js腳本呢?
這個問題的標題就不是很準確,按照問題的描述,是需要獲取一個url以及關聯的所有資源,http請求都是單個獨立的,和頁面鏈接了什麼資源沒什麼關係。很多回答的方式都很對了,selenium可以,phantomjs可以,自己嵌套一個webview更可以,當然實現方式都比較複雜。最簡單的方式是,先獲取頁面的內容,然後用正則解析拿到關聯資源的url,再把這些url的內容都獲取下來。
找個webview載入,不把這個view顯示出來。
Python的selenium webdriver可以完整的模擬瀏覽器操作(實際上就是由程序自動化控制的打開一個瀏覽器來操作)
如果你只是要獲得資源的話,在爬到的頁面html中收集所有鏈接,再去下載資源就可以了
不過如果你想要執行js的話就只有模擬瀏覽器一條路了,因為很多js本身就是用於展現畫面效果的,沒有瀏覽器,相應的js也沒什麼用處
還有一個web安全上面比較常用的工具叫burpsuite可以用於這類需要PhantomJS | PhantomJS
http://phantomjs.org
你說的是這個嗎?
最方便的應該是Selenium,各個語言的實現都有,因為這個就是用來模擬的瀏覽器的操作來進行web測試的.
PhathomJs也可以,是一個無頭完全的瀏覽器
有人說實現webview/qt webkit來實現模擬,這類方案,比較方便的可以electron,electron本身是webkit內核,同時通過了nodejs對各個事件進行綁定,應該是一個比較方便實現的方案.
最後還有個方案,就是利用tampermonkey/greasemonking這類插件直接在真實的chrome/firefox里寫腳本,chrome插件也可以,雖然有些限制,但還是可以模擬大部分操作.
應該差不多就這幾類了,歡迎大家一起來補充用 headless browser
推薦閱讀:
※現代編譯器是如何實現自定義函數在main()函數之後實現的呢?
※C++ 「==」運算符取值問題?
※每次編程開始先輸入 #include,那麼計算機在讀取 # 符號的時候 正在做什麼?
※C++ 和 Objective-C 都可以 100% 翻譯為 C 代碼嗎?
※搞oi/acm的大神為什麼要#define N 1000+10?