java學習-GET方式抓取網頁(UrlConnection和HttpClient) 參考
阿新 • • 發佈:2019-02-09
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 = newURL(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.36user_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(); } }