利用http协议调用外部接口+用json和正则解析字符串

利用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

利用http协议调用外部接口+用json和正则解析字符串的相关文章

JSON parse eval 将字符串转换为json的异同

SON(JavaScript Object Notation)是一種輕量級的數據格式,采用完全獨立於語言的文本格式,是理想的數據交換格式.同時,JSON是Javascript原生格式,這意味着在javascript中處理JSON數據不需要任何特殊的API或工具包,而且效率非常高. JSON的結構如下: “名稱/值”對的集合(A collection of name/value pairs).不同的語言中,它被理解为對象(object),紀錄(record),結構(struct),字典(dicti

利用TCP协议实现通信

Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 客户端的步骤如下. (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,并等待服务器的回馈信息. (3)连接成功后,与服务器进行数据的交互. (4)数据处

[转]jQuery调用ASPX返回json

本文转自:http://www.cnblogs.com/fire-phoenix/archive/2009/11/13/1614146.html 本文介绍如何在ASP.NET(ASP.NET/AJAX)里使用基于JQuery的AJAX技术.(源代码下载见最后) 在使用JQuery前,请到www.jquery.com下载最新版本的js代码,然后再代码里使用 <script src="_scripts/jQuery-1.3.2.js" type="text/javascri

调用AJAX返回JSON、XML数据类型

1.调用AJAX返回JSON数据 用下拉列表显示Nation表民族名称 主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <he

如何用纯文本方式(XML)+HTTP协议调用Workday的web service?

我们知道,Workday系统本身很复杂,其发布的web服务(web service)也很多,而且其中的Web 服务(web service)中定义的Schema也很复杂.如果用AXIS或者XFire生成存根代码调用其相应模块的web service,比如Human Resource模块,也可以,但是生成的存根代码比较复杂,而且Workday的web服务本身也在不断的升级过程中,在升级的过程中,其Schema的信息也在不断变化和调整过程中,那么有没有一种以不变应万变的方式,答案是肯定的.那就是通过

利用iSCSI协议搭建IP-SAN

实验目的 本次实验是利用iSCSI协议来搭建一个IP-SAN系统 实验前提:准备一个共享的设备.在实验中,可以使用分区代替一个硬盘,如果使用分区代替硬盘设备,首先需要创建分区.创建过程不在给出,在这里我使用的共享设备为/dev/sdb实验平台为RHEL 5.8iSCSI target所在的主机地址为:192.168.108.150iSCSI initiator所在的主机地址有三个,分别为:192.168.108.199.192.168.108.201.192.168.108.202 IP-SAN

jQuery调用WebService返回JSON数据

相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,不清楚的可以在网上查一下,这里只说一下因为参数设置不当引起的取不到返回值的问题. 在用jQuery调用WebService的时候,它contentType默认为 以下是WebService服务端的代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.W

如何在Windows系统上利用Telnet协议连接Linux服务器

Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家演示如何在Windows系统上利用Telnet协议连接Linux服务器. 步骤一:在Windows系统上打开Telnet功能:  步骤二:在Linux系统上启用Telnet服务. 步骤一:Windows终端开启Telnet功能 1/由于在Windows Vista之后的版本默认并没有提供Telnet

20150307 利用smtp协议发送邮件

20150307 利用smtp协议发送邮件 2015-03-07 Lover雪儿 一.smtp匿名发邮件 ? Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. ? C:\Users\Administrator>nslookup -q=mx qq.com Server: XiaoQiang Address: 192.168.31.1 ? Non-au