1. 程式人生 > >java學習-GET方式抓取網頁(UrlConnection和HttpClient) 參考

java學習-GET方式抓取網頁(UrlConnection和HttpClient) 參考

URL:http://www.cnblogs.com/gne-hwz/p/6952312.html

抓取網頁其實就是模擬客戶端(PC端,手機端。。。)傳送請求,獲得響應資料documentation,解析對應資料的過程。---自己理解,錯誤請告知

一般常用請求方式有GET,POST,HEAD三種

GET請求的資料是作為url的一部分,對於GET請求來說,附帶資料長度有限制,資料安全性低

POST請求,資料作為標準資料傳輸給伺服器,資料長度沒有限制,資料通過加密傳輸,安全性高

HEAD類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

閒話少說。

通過GET請求獲取網頁

UrlConnection下載網頁通過InputStream讀取資料,通過FileOutPutStream將資料寫入檔案

複製程式碼
public class DownloadHtml {
 
    /**
     * 方法說明:用於下載HTML頁面
     *@param SrcPath  下載目標頁面的URL
     *@param filePath 下載得到的HTML頁面存放本地目錄
     *@param fileName  下載頁面的名字
     */
    public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){
        try{
            URL url = new
URL(SrcPath); URLConnection conn = url.openConnection(); //設定超時間為3秒 conn.setConnectTimeout(3*1000); //防止遮蔽程式抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //輸出流 InputStream str = conn.getInputStream();
//控制流的大小為1k byte[] bs = new byte[1024]; //讀取到的長度 int len = 0; //是否需要建立資料夾 File saveDir = new File(filePath); if(!saveDir.exists()){ saveDir.mkdir(); } File file = new File(saveDir+File.separator+fileName); //例項輸出一個物件 FileOutputStream out = new FileOutputStream(file); //迴圈判斷,如果讀取的個數b為空了,則is.read()方法返回-1,具體請參考InputStream的read(); while ((len = str.read(bs)) != -1) { //將物件寫入到對應的檔案中 out.write(bs, 0, len); } //重新整理流 out.flush(); //關閉流 out.close(); str.close(); System.out.println("下載成功"); }catch (Exception e) { e.printStackTrace(); } } //測試 public static void main(String[] args) { //下載網頁
    url是要下載的指定網頁,filepath存放檔案的目錄如
d:/resource/html/ ,filename指檔名如"下載的網頁.html"
         downloadHtmlByNet(url,filepath,filename);
    }
}
複製程式碼

HttpClient是Apache Jakarta Common 下的子專案。提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包

複製程式碼
public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){
        DefaultHttpClient httpClient=new DefaultHttpClient();//初始化httpclient
        BasicHttpParams httpParams=new BasicHttpParams();//初始化引數
//模擬瀏覽器訪問防止遮蔽程式抓取而返回403錯誤
user_agent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
user_agent="Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"

        httpParams.setParameter("http.useragent", user_agent);
        httpClient.setParams(httpParams);
        try {
            HttpGet httpGet=new HttpGet(SrcPath);
            HttpContext httpContext=new BasicHttpContext();
            HttpResponse httpResponse=httpClient.execute(httpGet,httpContext);
            HttpEntity entity=httpResponse.getEntity();
            if(entity!=null){
                writeToFile(entity,filePath,fileName);//將entity內容輸出到檔案
              
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         finally {
                httpClient.getConnectionManager().shutdown();
            }
    }
複製程式碼 複製程式碼
private static void writeToFile(HttpEntity entity, String filepath, String filename) {
        //輸出流
        try{
        InputStream str = entity.getContent();
        //控制流的大小為1k
        byte[] bs = new byte[1024];
        //讀取到的長度
        int len = 0;
        //是否需要建立資料夾
        File saveDir = new File(filePath);  
        if(!saveDir.exists())
           {
            saveDir.mkdir();  
           }
        File file = new File(saveDir+File.separator+fileName);
      //例項輸出一個物件
        FileOutputStream out = new FileOutputStream(file);
        //迴圈判斷,如果讀取的個數b為空了,則is.read()方法返回-1,具體請參考InputStream的read();
        while ((len = str.read(bs)) != -1) {
            //將物件寫入到對應的檔案中
            out.write(bs, 0, len);   
        }
        //重新整理流
        out.flush();
        //關閉流
        out.close();
        str.close();        
        System.out.println("下載成功");
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
複製程式碼