利用http协议调用url,进行对页面数据的抓取(听起来好像就是传说中的爬虫,百度那样的),代码如下:
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()方法如下:(将读取的内容转换成字节流)
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); }
调用方法如下(利用财付通的接口):
//得到抓取的数据 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格式(利用支付宝的接口)
//支付宝的编码方式是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,所以选择的正则表达式来匹配,也就麻烦了很多.
实现目的的方法有很多,所以别老一股劲钻进去了,切记!
时间: 2024-11-07 00:21:43