利用http協議調用外部接口+用json和正則解析字符串

利用http協議調用url,進行對頁面數據的抓取(聽起來好像就是傳說中的爬蟲,百度那樣的),代碼以下:html

public static String Get(String path,String encoding) throws Exception{
	//獲取須要抓取頁面的路徑
	URL url= new URL(path);
	//打開連接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //設置傳輸對象的方法get
	conn.setRequestMethod("GET");
	//設置連接的最大時間
	conn.setConnectTimeout(3 * 1000);
	//設置頭信息
	conn.setRequestProperty("Accept", "Accept:text/html,
	application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
	conn.setRequestProperty("Accept-Language", "zh-CN");
	conn.setRequestProperty("Accept-Encoding", "gzip, deflate, sdch");
	conn.setRequestProperty("User-Agent", "User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36");
	conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	conn.setRequestProperty("Connection", "Keep-Alive");
	//不進行緩存
	conn.setUseCaches(false);
	//頭部必須設置不緩存,不然第二次獲取不到sessionID
	conn.setUseCaches(false);
	    if(conn.getResponseCode()==200){
		return readStream(conn.getInputStream(),encoding);
	    }
				
		return "";
    }

radStream()方法以下:(將讀取的內容轉換成字節流)java

public static String readStream(InputStream inStream,String encoding) throws Exception{
        //byte輸出流
	ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
	//讀取字節數
	byte[] buffer = new byte[1024];
	int len = -1;
	//判斷是否有內容讀取
	while( (len=inStream.read(buffer)) != -1){
	        //將讀取的內容轉換成輸出流:buffer->讀取的數據 0->讀取的起始位置 len->讀取的長度
		outSteam.write(buffer, 0, len);
	}
	//關閉輸出輸入流(先開後關原則)
	outSteam.close();
	inStream.close(); 
	//讀取的內容以字節流輸出
	return new String(outSteam.toByteArray(),encoding);
	}

調用方法以下(利用財付通的接口):web

        //獲得抓取的數據
        String callerList = PostAndGetRequset.Get(Const.URL_CAIFUTONG
					+ model.getCaller(), "gb2312");
	//獲得抓取數據的參數
	String city = Tools.getStringFromHtml("<city>(.*?)</city>", callerList);
	String province = Tools.getStringFromHtml("<province>(.*?)</province>", callerList);
	String supplier = Tools.getStringFromHtml("<supplier>(.*?)</supplier>", callerList);
	//將參數設置成request的參數屬性
	request.setAttribute("屬性名",supplier+"-"+province+"-"+city);
	//頁面展現數據(jsp)
	request.屬性名

 getStringFromHtml()方法以下:(利用正則匹配抓取中的數據)正則表達式

// 匹配xml
	public static String getStringFromHtml(String patternString, String html) {
	        //條件
		Pattern pattern = Pattern.compile(patternString,
				Pattern.CASE_INSENSITIVE);
	        //與抓取中的數據相匹配
		Matcher matcher = pattern.matcher(html);
		//判斷是否匹配成功
		if (matcher.find()) {
		        //返回去掉帶有<>號的字段
			return matcher.group().replaceAll("<[^>]+>", "");
		} else {
			return "";
		}
	}

   String轉換成json格式(利用支付寶的接口)
json

    //支付寶的編碼方式是GBK
    String callerList = PostAndGetRequset.Get(Const.URL_TAOBAO + model.getCaller(), "GBK");
    //截取以"{"開頭的內容,由於json格式都是{name:xxx,sex:xxx}
    callerList = callerList.substring(callerList.indexOf("{"));
    //將字符串轉換成json格式
    JSONObject object = new JSONObject(callerList);
    //object.get("key")能夠獲得value值,從而做爲request屬性的值
    request.setAttribute("屬性名", object.get("catName")
    .toString()
    + "-"
    + object.get("carrier").toString()
    + "-"
    + object.get("province").toString());
    //頁面展現(jsp)
    request.屬性名

總結:利用http協議抓取頁面數據,而後利用某種方法(json)解析這些數據(抓取的數據所有都是字符串),將解析後的數據放入到request屬性值裏面,頁面就能夠獲取到了(利用struts2進行頁面數據交互)緩存

有人可能會問,爲何不用xml?不是有4種解析方法嗎?其實我也試過了,行不通,由於頁面抓取的數據都是不規則的,好比調用淘寶的接口返回的是json格式的數據(天然要用json解析),而財付通看起來是xml格式,但每次獲取的元素都是null,因此選擇的正則表達式來匹配,也就麻煩了不少.session

實現目的的方法有不少,因此別老一股勁鑽進去了,切記!app

相關文章
相關標籤/搜索