亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁(yè)并且保存

 更新時(shí)間:2016年12月27日 10:55:29   作者:ywl925  
本篇文章主要介紹了Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁(yè)并且保存 ,主要用UrlConnection、HttpClient爬取實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

對(duì)于網(wǎng)絡(luò),我一直處于好奇的態(tài)度。以前一直想著寫(xiě)個(gè)爬蟲(chóng),但是一拖再拖,懶得實(shí)現(xiàn),感覺(jué)這是一個(gè)很麻煩的事情,出現(xiàn)個(gè)小錯(cuò)誤,就要調(diào)試很多時(shí)間,太浪費(fèi)時(shí)間。

后來(lái)一想,既然早早給自己下了保證,就先實(shí)現(xiàn)它吧,從簡(jiǎn)單開(kāi)始,慢慢增加功能,有時(shí)間就實(shí)現(xiàn)一個(gè),并且隨時(shí)優(yōu)化代碼。

下面是我簡(jiǎn)單實(shí)現(xiàn)爬取指定網(wǎng)頁(yè),并且保存的簡(jiǎn)單實(shí)現(xiàn),其實(shí)有幾種方式可以實(shí)現(xiàn),這里慢慢添加該功能的幾種實(shí)現(xiàn)方式。

UrlConnection爬取實(shí)現(xiàn)

package html;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Spider {

  public static void main(String[] args) {
    
    String filepath = "d:/124.html";
    
    String url_str = "http://www.hao123.com/";
    URL url = null;
    try {
      url = new URL(url_str);
    } catch (MalformedURLException e) {
      e.printStackTrace();
    }
    
    String charset = "utf-8";
    int sec_cont = 1000;
    try {
      URLConnection url_con = url.openConnection();
      url_con.setDoOutput(true);
      url_con.setReadTimeout(10 * sec_cont);
      url_con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
      InputStream htm_in = url_con.getInputStream();
      
      String htm_str = InputStream2String(htm_in,charset);
      saveHtml(filepath,htm_str);
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * Method: saveHtml 
   * Description: save String to file
   * @param filepath
   * file path which need to be saved
   * @param str
   * string saved
   */
  public static void saveHtml(String filepath, String str){
    
    try {
      /*@SuppressWarnings("resource")
      FileWriter fw = new FileWriter(filepath);
      fw.write(str);
      fw.flush();*/
      OutputStreamWriter outs = new OutputStreamWriter(new FileOutputStream(filepath, true), "utf-8");
      outs.write(str);
      System.out.print(str);
      outs.close();
    } catch (IOException e) {
      System.out.println("Error at save html...");
      e.printStackTrace();
    }
  }
  /**
   * Method: InputStream2String 
   * Description: make InputStream to String
   * @param in_st
   * inputstream which need to be converted
   * @param charset
   * encoder of value
   * @throws IOException
   * if an error occurred 
   */
  public static String InputStream2String(InputStream in_st,String charset) throws IOException{
    BufferedReader buff = new BufferedReader(new InputStreamReader(in_st, charset));
    StringBuffer res = new StringBuffer();
    String line = "";
    while((line = buff.readLine()) != null){
      res.append(line);
    }
    return res.toString();
  }

}

實(shí)現(xiàn)過(guò)程中,爬取的網(wǎng)頁(yè)的中文亂碼問(wèn)題,是個(gè)比較麻煩的事情。

HttpClient爬取實(shí)現(xiàn)

HttpClient實(shí)現(xiàn)爬取網(wǎng)頁(yè)時(shí),遇到了很多問(wèn)題。其一,就是存在兩個(gè)版本的HttpClient,一個(gè)是sun內(nèi)置的,另一個(gè)是apache開(kāi)源的一個(gè)項(xiàng)目,似乎sun內(nèi)置用的不太多,我也就沒(méi)有實(shí)現(xiàn),而是采用了apache開(kāi)源項(xiàng)目(以后說(shuō)的HttpClient都是指apache的開(kāi)源版本);其二,在使用HttpClient時(shí),最新的版本已經(jīng)不同于以前的版本,從HttpClient4.x版本后,導(dǎo)入的包就已經(jīng)不一樣了,從網(wǎng)上找的很多部分都是HttpClient3.x版本的,所以如果使用最新的版本,還是看幫助文件為好。

我用的是Eclipse,需要配置環(huán)境導(dǎo)入引用包。

首先,下載HttpClient,地址是:http://hc.apache.org/downloads.cgi,我是用的事HttpClient4.2版本。

然后,解壓縮,找到了/lib文件夾下的commons-codec-1.6.jar,commons-logging-1.1.1.jar,httpclient-4.2.5.jar,httpcore-4.2.4.jar(版本號(hào)根據(jù)下載的版本有所不同,還有其他的jar文件,我這里暫時(shí)用不到,所以先導(dǎo)入必須的);

最后,將上面的jar文件,加入classpath中,即右擊工程文件 => Bulid Path => Configure Build Path => Add External Jar..,然后添加上面的包就可以了。

 還用一種方法就是講上面的包,直接復(fù)制到工程文件夾下的lib文件夾中。

下面是實(shí)現(xiàn)代碼:

package html;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.*;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class SpiderHttpClient {

  public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    String url_str = "http://www.hao123.com";
    String charset = "utf-8";
    String filepath = "d:/125.html";
    
    HttpClient hc = new DefaultHttpClient();
    HttpGet hg = new HttpGet(url_str);
    HttpResponse response = hc.execute(hg);
    HttpEntity entity = response.getEntity();
    
    
    InputStream htm_in = null;
    
    if(entity != null){
      System.out.println(entity.getContentLength());
      htm_in = entity.getContent();
      String htm_str = InputStream2String(htm_in,charset);
      saveHtml(filepath,htm_str);
    }
  }
  /**
   * Method: saveHtml 
   * Description: save String to file
   * @param filepath
   * file path which need to be saved
   * @param str
   * string saved
   */
  public static void saveHtml(String filepath, String str){
    
    try {
      /*@SuppressWarnings("resource")
      FileWriter fw = new FileWriter(filepath);
      fw.write(str);
      fw.flush();*/
      OutputStreamWriter outs = new OutputStreamWriter(new FileOutputStream(filepath, true), "utf-8");
      outs.write(str);
      outs.close();
    } catch (IOException e) {
      System.out.println("Error at save html...");
      e.printStackTrace();
    }
  }
  /**
   * Method: InputStream2String 
   * Description: make InputStream to String
   * @param in_st
   * inputstream which need to be converted
   * @param charset
   * encoder of value
   * @throws IOException
   * if an error occurred 
   */
  public static String InputStream2String(InputStream in_st,String charset) throws IOException{
    BufferedReader buff = new BufferedReader(new InputStreamReader(in_st, charset));
    StringBuffer res = new StringBuffer();
    String line = "";
    while((line = buff.readLine()) != null){
      res.append(line);
    }
    return res.toString();
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一篇文章帶你從java字節(jié)碼層理解i++和++i

    一篇文章帶你從java字節(jié)碼層理解i++和++i

    這篇文章帶你從java字節(jié)碼層理解i++和++i,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 詳解Java內(nèi)部類(lèi)——匿名內(nèi)部類(lèi)

    詳解Java內(nèi)部類(lèi)——匿名內(nèi)部類(lèi)

    這篇文章主要介紹了詳解Java 匿名內(nèi)部類(lèi)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)java 內(nèi)部類(lèi)的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-08-08
  • JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼實(shí)例

    JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼實(shí)例

    這篇文章主要介紹了JAVA Frame 窗體背景圖片,首位相接滾動(dòng)代碼示例,需要的朋友可以參考下復(fù)制代碼
    2017-04-04
  • Java Number類(lèi)原理實(shí)例解析

    Java Number類(lèi)原理實(shí)例解析

    這篇文章主要介紹了Java Number類(lèi)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 基于Spring監(jiān)聽(tīng)Binlog日志的方法詳解

    基于Spring監(jiān)聽(tīng)Binlog日志的方法詳解

    MySQL 的二進(jìn)制日志(binlog)有三種不同的格式,通常被稱(chēng)為 binlog 模式,這三種模式分別是 Statement 模式、Row 模式和Mixed 模式,本文將給大家介紹如何基于Spring監(jiān)聽(tīng)Binlog日志,需要的朋友可以參考下
    2024-09-09
  • datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例

    datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例

    本篇文章主要介紹了datatables 帶查詢(xún)條件java服務(wù)端分頁(yè)處理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • spring中自動(dòng)注入注解的實(shí)現(xiàn)方式

    spring中自動(dòng)注入注解的實(shí)現(xiàn)方式

    在Spring框架中,AutowiredAnnotationBeanPostProcessor負(fù)責(zé)處理@Autowired和@Value注解,實(shí)現(xiàn)依賴(lài)注入,首先通過(guò)TypeMappedAnnotations獲取注解,并根據(jù)注解屬性構(gòu)建InjectionMetadata,存入緩存
    2024-09-09
  • springboot starter自定義實(shí)現(xiàn)公共模塊方式

    springboot starter自定義實(shí)現(xiàn)公共模塊方式

    這篇文章主要介紹了springboot starter自定義實(shí)現(xiàn)公共模塊方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java?split方法使用超詳細(xì)講解

    Java?split方法使用超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java?split方法使用的相關(guān)資料,Java中的我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,需要的朋友可以參考下
    2023-10-10
  • 聊聊Lombok中的@Builder注解使用教程

    聊聊Lombok中的@Builder注解使用教程

    @Builder注解的作用主要是用來(lái)生成對(duì)象,并且可以為對(duì)象鏈?zhǔn)劫x值。接下來(lái)通過(guò)本文給大家介紹Lombok中的@Builder注解使用教程,感興趣的朋友一起看看吧
    2021-11-11

最新評(píng)論