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渲染須要時間,這裏是等待了三秒,而後成功獲取通過處理的源碼
但願對你們有所幫助
以上