ミムの部屋

社内SEが,興味をもったことを書いていきます.

Java でHTTP通信を行う

前回は,AndroidアプリによりHTTP通信のソースコードを書きました.
java のみの場合はどうなるんだろうと思い調べ,以下のようにすればいいということがわかりました.


import java.net.*;
import java.io.*;

/**
 * Java HTTP クライアントサンプル - Socket 版 -
 *
 */
public class So {
    public static void main(String[] args){
        String host = "ホスト";
        int port = 80;
        String path = "取得したいURL";

        Socket socket;
        BufferedReader reader;
        BufferedWriter writer;

        try {
            socket = new Socket(host, port);
            reader =
                new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer =
                new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            writer.write("GET " + path + " HTTP/1.0\r\n");
            writer.write("Host: " + host + ":" + port + "\r\n");
            writer.write("\r\n");
            writer.flush();

            while (true){
                String line = reader.readLine();
                if ( line == null ){
                    break;
                }
                System.out.println(line);
            }
            reader.close();
            writer.close();
            socket.close();

        } catch (UnknownHostException e){
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
参考URL:Java で HTTP クライアントを作ってみよう (2)

そして,上のソースコードを用いて以下の二つを取得するものを作ってみたいと思います.
  1. 絶対パスの html
  2. 相対パスの html

以下がそのソースコードです.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.imageio.IIOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class Data {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
      String url = "対象のURL";

try{
        // Jsoup により,HTML を取得
	Document document = Jsoup.connect(url).get();
       
        // リンクの属性である"a"のものを取得する.
	Elements  atags = document.getElementsByTag("a");

        // 正規表現により,文頭に"http"がついているものを判別するように指定
	String regex ="^http";
	Pattern p = Pattern.compile(regex);

        // 相対・絶対 html ファイルをそれぞれ5つもってくるためのカウント変数
	int i=0;
	int j=5;
	
	for(Element atag:atags){
            Matcher m= p.matcher(atag.attr("href"));	
	    System.out.println("atag.attr(\"href\"):" + atag.attr("href"));

        // 絶対パスでの html であった場合,それをファイルにする
	if(m.find() && i < 5){
		try{
			File file = new File(i+".html");
			FileWriter filewriter =new FileWriter(file);
			filewriter.write(Jsoup.connect(atag.attr("href")).get().outerHtml());
			filewriter.close();
		}catch(IIOException e){
			System.out.println(e);
		}
		i++;

        // 相対パスの html である場合,対象URLを付加して絶対パスにしてファイルにする
	}else if(!m.find() && j < 10){
		try{
			File file = new File(j+".html");
			FileWriter filewriter =new FileWriter(file);
			filewriter.write(Jsoup.connect("対象URL"+atag.attr("href")).get().outerHtml());
			filewriter.close();
		}catch(IIOException e){
			System.out.println(e);
		}
		j++;
	}
	}
} catch (IOException e){
	e.printStackTrace();
}
	}

}