java_爬蟲_獲取通過js渲染後的網頁源碼

mdjavascript

弄了一天了……(這個月不會在摸爬蟲了,浪費生命)css

 

進入正題:html

起初是想寫一個爬蟲來爬一個網站的視頻,可是怎麼爬取都爬取不到,分析了下源代碼以後,發現源代碼中並無視頻的domjava

可是在瀏覽器檢查元素的時候又是有的,這就讓我很難過了web

百度了一大天,發現是由於普通方法獲取的只是服務器端本地的靜態資源,也就是第一手資源瀏覽器

而瀏覽器檢查元素的資源是通過js渲染後的代碼服務器

因此就要想辦法去得到渲染後的代碼dom

在看了若干個帖子以後……外加上一個httpclient課程和另外一個htmlunit課程……工具

終於,在看完一個帖子後,知道了怎麼獲取渲染後網頁的代碼網站

首先,httpclient是普通httlurlConnection的升級版,能夠模擬瀏覽器以防止被服務器封殺

可是抓取的源代碼是靜態的一手源代碼,沒有通過js渲染後的內容

因此就須要htmlunit工具,來讓頁面通過渲染,而後獲取源代碼

htmlunit的主要功能就是模擬人工操做頁面內的元素,因爲沒有gui,因此要比普通操做要快,可是實際操做後發現仍是須要肉眼可見的時間

具體兩個工具的jar包在哪兒下載不在這贅述,相信看到這篇文章的人都應該知道在那裏獲取資源

下面直接貼上源碼,具體語句含義在註釋中有

源代碼以下:

import java.io.IOException; import java.net.MalformedURLException; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class HtmlUnit { public static void main(String[] args) { WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);//模擬火狐瀏覽器 try { // HtmlPage page = webClient.getPage("http://www.baidu.com"); // webClient.getOptions().setCssEnabled(false); // webClient.getOptions().setJavaScriptEnabled(false);
            webClient.setJavaScriptTimeout(5000); webClient.getOptions().setUseInsecureSSL(true);//接受任何主機鏈接 不管是否有有效證書
            webClient.getOptions().setJavaScriptEnabled(true);//設置支持javascript腳本 
            webClient.getOptions().setCssEnabled(false);//禁用css支持 // webClient.getOptions().set
            webClient.getOptions().setThrowExceptionOnScriptError(false);//js運行錯誤時不拋出異常
            webClient.getOptions().setTimeout(100000);//設置鏈接超時時間
            webClient.getOptions().setDoNotTrackEnabled(false); // HtmlPage page = webClient.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");
            HtmlPage page = webClient.getPage("http://www.enmeiyiyuan.com/look-5bf3f60b83145.html"); // String res=page.asText();
            Thread.sleep(3000); System.out.println(page.asXml()); } catch (FailingHttpStatusCodeException e) { // TODO 自動生成的 catch 塊
 e.printStackTrace(); } catch (MalformedURLException e) { // TODO 自動生成的 catch 塊
 e.printStackTrace(); } catch (IOException e) { // TODO 自動生成的 catch 塊
 e.printStackTrace(); } catch (InterruptedException e) { // TODO 自動生成的 catch 塊
 e.printStackTrace(); }finally { webClient.close(); } } }

 

那些註釋掉的是以前嘗試的……

而後必定要注意加上線程等待時間,否則獲取的大機率仍是第一手代碼,由於js渲染須要時間,這裏是等待了三秒,而後成功獲取通過處理的源碼

 

但願對你們有所幫助

以上

相關文章
相關標籤/搜索