Java는 웹 페이지를 찾아서 저장하는 두 가지 방법을 간단하게 설명합니다.

인터넷에 대해 나는 줄곧 호기심 어린 태도에 처해 있다.예전에는 파충류를 쓰려고 했지만 미루고 미루고 실현하기 귀찮아서 귀찮은 일인 것 같습니다. 작은 실수가 생기면 많은 시간을 디버깅해야 하기 때문에 시간을 너무 낭비합니다.
나중에 생각해 보니 일찌감치 자신에게 보증을 섰으니 먼저 그것을 실현하자. 간단하게 시작해서 천천히 기능을 늘리고 시간이 있으면 하나를 실현하며 수시로 코드를 최적화한다.
다음은 제가 지정한 웹 페이지를 기어오르고 저장하는 간단한 실현입니다. 사실은 몇 가지 방식이 있습니다. 여기에 이 기능을 천천히 추가하는 몇 가지 실현 방식이 있습니다.
UrlConnection 기어오르기 구현

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();
  }

}

실현 과정에서 찾은 웹 페이지의 중국어 난수 문제는 비교적 번거로운 일이다.
HttpClient 기어오르기 구현
HttpClient에서 웹 페이지를 찾을 때 많은 문제가 발생했습니다.첫째, 두 가지 버전의 HttpClient가 존재하는데 하나는 선이 내장된 것이고 다른 하나는 아파치가 오픈한 프로젝트이다. 선이 많이 사용되지 않는 것 같아서 나도 실현하지 않고 아파치 오픈 프로젝트를 사용했다(앞으로 말한 HttpClient는 모두apache의 오픈 버전을 가리킨다).둘째, HttpClient를 사용할 때 최신 버전은 이전 버전과 다르다. HttpClient4.x 버전 이후 가져온 가방은 이미 다르다. 인터넷에서 찾은 많은 부분은 HttpClient3이다.x 버전이므로 최신 버전을 사용하려면 도움말 파일을 보는 것이 좋습니다.
Eclipse를 사용합니다. 환경을 설정하여 인용 패키지를 가져와야 합니다.
우선, 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(버전 번호는 다운로드한 버전에 따라 다르고 다른jar 파일도 있습니다. 저는 여기서 잠시 사용할 수 없기 때문에 필요한 것을 먼저 가져옵니다.
마지막으로 위의jar 파일을 classpath에 추가합니다. 즉, 프로젝트 파일 => Bulid Path => Configure Build Path => Add External Jar...그리고 위에 있는 가방을 추가하면 됩니다.
위의 패키지를 프로젝트 폴더 아래의lib 폴더로 직접 복사하는 방법도 있다.
다음은 구현 코드입니다.

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();
  }
}

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기