Java Webソースとアナログブラウザリクエストの取得(個人概要)


Javaはソースコードを取得して自分で知っているいくつかの方法をまとめます.
1:GetSourceCode.java
package kalision;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class GetSourceCode {

  public static void main(String[] args) throws IOException {
    HttpURLConnection huc;

    URL myurl = new URL("http://www.baidu.com");	//       。

    huc = (HttpURLConnection) myurl.openConnection();
    BufferedReader in;
    in = new BufferedReader(new InputStreamReader(huc.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
      System.out.println(line);
    }

  }
}

または
2.test1.java
package kalision;


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 java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;

public class test1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			 URL url = new URL("http://train.qunar.com/stationToStation.htm?fromStation=%E6%B5%8E%E5%8D%97&toStation=%E7%83%9F%E5%8F%B0&date=2012-01-08");

			 URLConnection conn = url.openConnection();
			 conn.setDoOutput(true);
			 InputStream in = null;
			 in = url.openStream();
			 String content = pipe(in,"utf-8");
			 
			 System.out.println(content);
			 
			 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	static String pipe(InputStream in,String charset) throws IOException {
        StringBuffer s = new StringBuffer();
        if(charset==null||"".equals(charset)){
        	charset="utf-8";
        }
        String rLine = null;
        BufferedReader bReader = new BufferedReader(new InputStreamReader(in,charset));
        PrintWriter pw = null;
        
		FileOutputStream fo = new FileOutputStream("../index.html");
		OutputStreamWriter writer = new OutputStreamWriter(fo, "utf-8");
		pw = new PrintWriter(writer);
        while ( (rLine = bReader.readLine()) != null) {
            String tmp_rLine = rLine;
            int str_len = tmp_rLine.length();
            if (str_len > 0) {
              s.append(tmp_rLine);
              pw.println(tmp_rLine);
              pw.flush();
            }
            tmp_rLine = null;
       }
        in.close();
        pw.close();
        return s.toString();
	}
}

注意:
得られたソースファイルが保存されて実行されると、文字化けします.符号化の問題のためです.変更を試みることができます
ソースファイルヘッダの符号化は、GBK等であればよい.
以上の2つの方法でページのソースコードを得ることができます.
要求パラメータのあるページについては、次のようにします.
test 1クラスのurlは、get方式でコミットされたurlを持つパラメータ付き接続を要求します.
返されるソースコードには、私たちが望んでいるデータがない可能性があります.
個人的には、このページの多くは別のページに配置されていることがわかります.
返されたソースファイルでjsで動的にページを移動し、動的データを取得してこのページにロードします.
firebugなどのツールでこのページを捕まえることができます.
解析に必要な動的データを解析します.
もちろん個人的にはこのような仕事は、お勧めではありません.実現しにくい.
上記のget方式のコミットではurlの後ろに直接パラメータを追加できます.次はpost方式でデータをコミットして要求します.
1.Test.java
import java.util.Properties;


public class Test {

	 public static void testRequestPostStringByteArray() throws Exception {   
	        Properties requestProperties = new Properties();   
	  
	        //           
	        requestProperties   
	                .put(   
	                        "User-Agent",   
	                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; .NET CLR 1.1.4322)");   
	  
	        byte[] b = HtmlPost.requestPost("http://train.qunar.com/stationToStation.htm?fromStation=%E5%8C%97%E4%BA%AC&toStation=%E4%B8%8A%E6%B5%B7&date=2012-01-01",   
	                "XML".getBytes());   
	        System.err.println(new String(b, "utf-8"));   
	    }   
	  
	    /**  
	     * Test method for  
	     * {@link org.zlex.commons.net.NetUtils#requestPostForm(java.lang.String, java.util.Properties)}  
	     * .  
	     */  
	    public static void testRequestPostForm() throws Exception {   
	        Properties formProperties = new Properties();   
	  
	        formProperties.put("ictN", "5924");
	        formProperties.put("fdl", "");
	        formProperties.put("lx", "00");
	        formProperties.put("nyear3", "2011");
	        formProperties.put("nyear3_new_value", "true");
	        formProperties.put("nmonth3", "12");
	        formProperties.put("nmonth3_new_value", "true");
	        formProperties.put("nday3", "27");
	        formProperties.put("nday3_new_value", "false");
	        formProperties.put("startStation_ticketLeft", "6d4e53e80482a0b7");
	        formProperties.put("startStation_ticketLeft_new_value", "true");
	        formProperties.put("arriveStation_ticketLeft", "53174e1300e781a2");
	        formProperties.put("arriveStation_ticketLeft_new_value", "true");
	        formProperties.put("trainCode", "");
	        formProperties.put("trainCode_new_value", "true");
	        formProperties.put("rFlag", "1");
	        formProperties.put("name_ckball", "value_ckball");
	        formProperties.put("tFlagDC", "DC");
	        formProperties.put("tFlagZ", "Z");
	        formProperties.put("tFlagT", "T");
	        formProperties.put("tFlagK", "K");
	        formProperties.put("tFlagPK", "PK");
	        formProperties.put("tFlagPKE", "PKE");
	        formProperties.put("tFlagLK", "LK");
	        formProperties.put("randCode", "BYHJ");
	        
	        byte[] b = HtmlPost.requestPostForm(   
	                "http://dynamic.12306.cn/TrainQuery/iframeLeftTicketByStation.jsp",   
	                formProperties);   
//	        byte[] b = HtmlPost.requestPostForm(   
//	                "http://train.qunar.com/stationToStation.htm?fromStation=%E5%8C%97%E4%BA%AC&toStation=%E5%B9%BF%E5%B7%9E&date=2011-12-31",   
//	                formProperties);   
//	        
	        
	        System.err.println(new String(b, "utf-8"));   
	    }   
	    public static void main(String args[]){
	    	
	    	try {
				testRequestPostForm();
	    	//	testRequestPostStringByteArray();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }

}