Получить HTML-файл Java - PullRequest
       32

Получить HTML-файл Java

1 голос
/ 01 апреля 2009

Дубликат:

Как программно загрузить веб-страницу на Java?

Как получить HTML в Java

Я разрабатываю приложение, которое состоит из: пользователь вводит URL какого-либо веб-сайта, а затем приложение должно проанализировать этот URL.

Как я могу получить доступ к файлу HTML, используя Java? Нужно ли использовать HttpRequest? Как это работает?

Thks.

Ответы [ 5 ]

5 голосов
/ 01 апреля 2009

URLConnection подходит для простых случаев. Когда есть такие вещи, как перенаправления, вам лучше использовать Apache HTTPClient

4 голосов
/ 01 апреля 2009

Вы можете просто использовать URLConnection. См. Учебник по Java от Sun

1 голос
/ 01 апреля 2009

Этот код загружает данные из URL, обрабатывая их как двоичное содержимое:

public class Download {

  private static void download(URL input, File output)
      throws IOException {
    InputStream in = input.openStream();
    try {
      OutputStream out = new FileOutputStream(output);
      try {
        copy(in, out);
      } finally {
        out.close();
      }
    } finally {
      in.close();
    }
  }

  private static void copy(InputStream in, OutputStream out)
      throws IOException {
    byte[] buffer = new byte[1024];
    while (true) {
      int readCount = in.read(buffer);
      if (readCount == -1) {
        break;
      }
      out.write(buffer, 0, readCount);
    }
  }

  public static void main(String[] args) {
    try {
      URL url = new URL("http://stackoverflow.com");
      File file = new File("data");
      download(url, file);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

Недостатком этого подхода является то, что он игнорирует любые метаданные, такие как Content-Type , которые вы получите от использования HttpURLConnection (или более сложного API, такого как апач один).

Чтобы проанализировать данные HTML, вам понадобится либо специализированный анализатор HTML, который может обрабатывать неправильно сформированную разметку, либо аккуратный перед анализом с использованием анализатора XML.

0 голосов
/ 01 апреля 2009

Как ни странно, я написал вспомогательный метод, который делает это на прошлой неделе

/**
 * Retrieves the file specified by <code>fileUrl</code> and writes it to 
 * <code>out</code>.
 * <p>
 * Does not close <code>out</code>, but does flush.
 * @param fileUrl The URL of the file.
 * @param out An output stream to capture the contents of the file
 * @param batchWriteSize The number of bytes to write to <code>out</code>
 *                       at once (larger files than this will be written
 *                       in several batches)
 * @throws IOException If call to web server fails
 * @throws FileNotFoundException If the call to the web server does not
 *                               return status code 200. 
 */
public static void getFileStream(String fileURL, OutputStream out, int batchWriteSize)
                            throws IOException{
    GetMethod get = new GetMethod(fileURL);
    HttpClient client = new HttpClient();
    HttpClientParams params = client.getParams();
    params.setSoTimeout(2000);
    client.setParams(params);
    try {
        client.executeMethod(get);
    } catch(ConnectException e){
        // Add some context to the exception and rethrow
        throw new IOException("ConnectionException trying to GET " + 
                fileURL,e);
    }

    if(get.getStatusCode()!=200){
        throw new FileNotFoundException(
                "Server returned " + get.getStatusCode());
    }

    // Get the input stream
    BufferedInputStream bis = 
        new BufferedInputStream(get.getResponseBodyAsStream());

    // Read the file and stream it out
    byte[] b = new byte[batchWriteSize];
    int bytesRead = bis.read(b,0,batchWriteSize);
    long bytesTotal = 0;
    while(bytesRead!=-1) {
        bytesTotal += bytesRead;
        out.write(b, 0, bytesRead);
        bytesRead = bis.read(b,0,batchWriteSize);;
    } 
    bis.close(); // Release the input stream.
    out.flush();        
}

Использует библиотеку Apache Commons, т. Е.

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
0 голосов
/ 01 апреля 2009

Вы можете использовать java.net.URL, а затем открыть поток ввода для чтения HTML-кода с сервера. Смотрите пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...