htmlunit抓取js執行后的網頁源碼


上次我不是寫了一個自動抓取博客訪問量嗎 (點擊打開鏈接) 可是昨天晚上我又運行的時候,發現不能用了。。

運行了幾次 發現使用URLConnection 得到的網頁源碼和瀏覽器直接查看的不同。 URLConnection 使用IO流讀取到的源碼

只有積分  沒有訪問量了

而使用瀏覽器訪問 直接查看源碼

有訪問。

這也就導致了我的程序不能用了  需要更新了大哭

 

想想原因   可能是幕后主使人把訪問量放在了js里面   動態展示,而我使用URLConnection 訪問的靜態界面  確確實實沒有收到。

於是開始百度了  百度過來 百度過去。。

發現了一個回復了三年還沒有結貼的帖子

 

java爬蟲項目,如何獲取js執行后的完整網頁源代碼?  

里面回復了好多方法  發現有個htmlunit  於是就自己測試一下
發現真的可以。得到了js執行后的源碼。
廢話不說了。
方法如下
  1. public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {  
  2.         // TODO Auto-generated method stub  
  3.         WebClient wc=new WebClient(BrowserVersion.FIREFOX_24);  
  4.         wc.setJavaScriptTimeout(5000);  
  5.         wc.getOptions().setUseInsecureSSL(true);//接受任何主機連接 無論是否有有效證書  
  6.         wc.getOptions().setJavaScriptEnabled(true);//設置支持javascript腳本   
  7.         wc.getOptions().setCssEnabled(false);//禁用css支持  
  8.         wc.getOptions().setThrowExceptionOnScriptError(false);//js運行錯誤時不拋出異常  
  9.         wc.getOptions().setTimeout(100000);//設置連接超時時間  
  10.         wc.getOptions().setDoNotTrackEnabled(false);   
  11.         HtmlPage page=wc.getPage("http://blog.csdn.net/su20145104009?viewmode=contents");  
  12.           
  13.         String res=page.asText();  
  14.         //處理源碼  
  15.         deal(res);  
  16.           
  17.     }  

最后得到的源碼如下:
其它的代碼和 點擊打開鏈接 這篇文章相比幾乎沒變。如果不明白 可以去看一下  這里就不再贅述了
 
執行后  成功寫入到txt文檔
使用了htmlunit會彈出好多異常警告
加上這些代碼  就會消失了~
  1. LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log",    "org.apache.commons.logging.impl.NoOpLog");  
  2.   
  3.         java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")  
  4.             .setLevel(Level.OFF);  
  5.   
  6.         java.util.logging.Logger.getLogger("org.apache.commons.httpclient")  
  7.             .setLevel(Level.OFF);  

由於我們在這里 引入了htmlunit 的jar包  .那么再用上次的腳本批量處理 就行不通了 ~
而且要引入的jar包也不是一個  是多個  所以要批量處理了
首先我們要把所有要用的jar包 使用-cp命令導入。
可是htmlunit的jar包太多了  所以想到一個方法  使用for循環遍歷htmlunit文件夾里面的jar文件  將其處理為一個字符串 然后再使用-cp命令 全部代碼如下
  1. echo off  
  2. setlocal enabledelayedexpansion  
  3. ::定義一個字符串  
  4. set str=  
  5. ::遍歷htmlunit文件夾  
  6. for /f "delims=" %%a in ('dir /b "E:\lib\htmlunit-2.14-bin\lib\*.jar"') do (  
  7. set "str=!str!E:\lib\htmlunit-2.14-bin\lib\%%a;"  
  8. )  
  9. echo on  
  10. e:  
  11. javac -cp .;%str% AutoMarkBlogView.java  
  12. java -cp .;%str% AutoMarkBlogView  
  13. pause  
運行結果如下:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM