Java에서 웹 페이지를 프로그래밍 방식으로 다운로드하는 방법
html에 할 수 .String
을 사용하다또한 다양한 종류의 압축에 어떻게 대처할 수 있을까요?
자바에서는 어떻게 하면 좋을까요?
저는 Jsoup처럼 괜찮은 HTML 파서를 사용하겠습니다.이 작업은 다음과 같이 간단합니다.
String html = Jsoup.connect("http://stackoverflow.com").get().html();
GZIP 및 청크 응답 및 문자 인코딩을 완전히 투과적으로 처리합니다.또한 jQuery가 할 수 있는 것과 같은 CSS 셀렉터에 의한 HTML 트래버싱이나 조작 등 더 많은 이점을 제공합니다.그냥 이렇게 잡기만 하면 돼요Document
아닌, 「」로서String
.
Document document = Jsoup.connect("http://google.com").get();
기본 String 메서드를 실행하거나 HTML에서 regex를 실행하지 않는 것이 좋습니다.
다음 항목도 참조하십시오.
다음은 Java의 URL 클래스를 사용하여 테스트된 코드입니다.다만, 예외 처리나 콜 스택으로의 이행에 대해서는, 여기서보다 더 좋은 처리를 추천합니다.
public static void main(String[] args) {
URL url;
InputStream is = null;
BufferedReader br;
String line;
try {
url = new URL("http://stackoverflow.com/");
is = url.openStream(); // throws an IOException
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (is != null) is.close();
} catch (IOException ioe) {
// nothing to see here
}
}
}
Bill의 답변은 매우 좋지만, 압축이나 사용자 에이전트와 같은 요청으로 몇 가지 작업을 수행할 수 있습니다.다음 코드는 요청에 대해 다양한 유형의 압축을 수행할 수 있는 방법을 보여 줍니다.
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Cast shouldn't fail
HttpURLConnection.setFollowRedirects(true);
// allow both GZip and Deflate (ZLib) encodings
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = conn.getContentEncoding();
InputStream inStr = null;
// create the appropriate stream wrapper based on
// the encoding type
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
inStr = new GZIPInputStream(conn.getInputStream());
} else if (encoding != null && encoding.equalsIgnoreCase("deflate")) {
inStr = new InflaterInputStream(conn.getInputStream(),
new Inflater(true));
} else {
inStr = conn.getInputStream();
}
사용자 에이전트도 설정하려면 다음 코드를 추가합니다.
conn.setRequestProperty ( "User-agent", "my agent name");
음, URL이나 URL Connection과 같은 내장 라이브러리를 사용할 수 있지만, 이러한 라이브러리는 그다지 많은 제어를 제공하지 않습니다.
개인적으로 Apache HTTPClient 라이브러리로 하겠습니다.
편집: Apache에서 HTTP Client를 종료로 설정했습니다.대체는 HTTP 컴포넌트입니다.
위의 모든 접근방식은 브라우저에 표시되는 웹 페이지텍스트를 다운로드하지 않습니다.요즘에는 html 페이지에 있는 스크립트를 통해 브라우저에 많은 데이터가 로드됩니다.위의 기술 중 어느 것도 스크립트를 지원하지 않고 html 텍스트만 다운로드합니다.HTMLUNIT은 javascript를 지원합니다.따라서 웹 페이지 텍스트를 브라우저에서 볼 수 있는 대로 다운로드하려면 HTMLUNIT을 사용해야 합니다.
대부분의 경우 보안 웹 페이지(https 프로토콜)에서 코드를 추출해야 합니다.다음 예제에서는 html 파일을 c:\temp\filename.html Enjoy에 저장합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
/**
* <b>Get the Html source from the secure url </b>
*/
public class HttpsClientUtil {
public static void main(String[] args) throws Exception {
String httpsURL = "https://stackoverflow.com";
String FILENAME = "c:\\temp\\filename.html";
BufferedWriter bw = new BufferedWriter(new FileWriter(FILENAME));
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
con.setRequestProperty ( "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" );
InputStream ins = con.getInputStream();
InputStreamReader isr = new InputStreamReader(ins, "Windows-1252");
BufferedReader in = new BufferedReader(isr);
String inputLine;
// Write each line into the file
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
bw.write(inputLine);
}
in.close();
bw.close();
}
}
NIO.2의 강력한 Files.copy(InputStream in, Path target)를 사용하여 이를 수행하려면 다음 절차를 따릅니다.
URL url = new URL( "http://download.me/" );
Files.copy( url.openStream(), Paths.get("downloaded.html" ) );
Unix/Linux 박스에서는 'wget'만 실행할 수 있지만 크로스 플랫폼클라이언트를 쓸 때는 이 옵션을 사용할 수 없습니다.물론 다운로드 시점부터 디스크에 도달하는 시점까지 다운로드한 데이터에 대해 그다지 많은 작업을 하고 싶지 않다고 가정합니다.
이 클래스의 도움을 받아 코드를 얻고 몇 가지 정보를 필터링합니다.
public class MainActivity extends AppCompatActivity {
EditText url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
url = ((EditText)findViewById( R.id.editText));
DownloadCode obj = new DownloadCode();
try {
String des=" ";
String tag1= "<div class=\"description\">";
String l = obj.execute( "http://www.nu.edu.pk/Campus/Chiniot-Faisalabad/Faculty" ).get();
url.setText( l );
url.setText( " " );
String[] t1 = l.split(tag1);
String[] t2 = t1[0].split( "</div>" );
url.setText( t2[0] );
}
catch (Exception e)
{
Toast.makeText( this,e.toString(),Toast.LENGTH_SHORT ).show();
}
}
// input, extrafunctionrunparallel, output
class DownloadCode extends AsyncTask<String,Void,String>
{
@Override
protected String doInBackground(String... WebAddress) // string of webAddress separate by ','
{
String htmlcontent = " ";
try {
URL url = new URL( WebAddress[0] );
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.connect();
InputStream input = c.getInputStream();
int data;
InputStreamReader reader = new InputStreamReader( input );
data = reader.read();
while (data != -1)
{
char content = (char) data;
htmlcontent+=content;
data = reader.read();
}
}
catch (Exception e)
{
Log.i("Status : ",e.toString());
}
return htmlcontent;
}
}
}
Jetty에는 웹 페이지 다운로드에 사용할 수 있는HTTP 클라이언트가 있습니다.
package com.zetcode;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
public class ReadWebPageEx5 {
public static void main(String[] args) throws Exception {
HttpClient client = null;
try {
client = new HttpClient();
client.start();
String url = "http://example.com";
ContentResponse res = client.GET(url);
System.out.println(res.getContentAsString());
} finally {
if (client != null) {
client.stop();
}
}
}
}
이 예에서는 단순한 웹 페이지의 내용을 인쇄합니다.
Java 튜토리얼의 웹 페이지 읽기에서는 URL, JSoup, HtmlCleaner, Apache HttpClient, Jetty HttpClient 및 HtmlUnit을 사용하여 Java에서 웹 페이지 프로그램을 다운로드하는 예를 6개 작성했습니다.
이 투고(url)에 대한 실제 답변을 사용하여 출력을 파일로 작성했습니다.
package test;
import java.net.*;
import java.io.*;
public class PDFTest {
public static void main(String[] args) throws Exception {
try {
URL oracle = new URL("http://www.fetagracollege.org");
BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));
String fileName = "D:\\a_01\\output.txt";
PrintWriter writer = new PrintWriter(fileName, "UTF-8");
OutputStream outputStream = new FileOutputStream(fileName);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
writer.println(inputLine);
}
in.close();
} catch(Exception e) {
}
}
}
언급URL : https://stackoverflow.com/questions/238547/how-do-you-programmatically-download-a-webpage-in-java
'programing' 카테고리의 다른 글
mysql에 한 테이블에서 다른 테이블로 데이터를 삽입합니다. (0) | 2023.01.10 |
---|---|
파일의 선두에서 「」를 삭제하려면 어떻게 해야 합니까? (0) | 2023.01.10 |
NuxtServerInit이 Vuex 모듈 모드에서 작동하지 않음 - Nuxt.js (0) | 2022.12.26 |
코드에서 jQuery 변경 이벤트를 트리거하는 방법 (0) | 2022.12.26 |
수업 방법의 목적은 무엇입니까? (0) | 2022.12.26 |