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();
}
}
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.