Java实现抓取百度识图结果的实现和思路-2-Json的处理

上一篇文章的断点传输以后再讲_(:зゝ∠)_,先讲讲json的处理

什么是json???举个例子

似乎短了点,如果用昨天的postURL案例得到的网址去访问的话,也可能会得到类似的结果,不过真实情况是会有结果链接、特征码和图片链接的,怎么会没有呢?

因为复制黏贴直接去访问的话,是没有设置请求头User-Agent的,而服务器会根据请求头,决定是否要对其请求进行处理

设置请求头的方法在前面的教程已经说过了:

httpPost post=new Post(链接);
post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER");

当然也可以用它来设置其他的请求头!

还有下面才是有加请求头才能得到的完整JSON!

{"errno":0,"errmsg":"","data":{

"querySign":"671742422,3099122694",

"imageUrl":"http:\/\/g.hiphotos.baidu.com\/image\/pic\/item\/8601a18b87d6277f00a269b322381f30e824fc8d.jpg",

"pageUrl":"http:\/\/image.baidu.com\/n\/pc_search?rn=30&appid=0&tag=1&isMobile=0&queryImageUrl=

http%3A%2F%2Fg.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F8601a18b87d6277f00a269b322381f30e824fc8d.jpg&

querySign=671742422%2C3099122694&uptype=upload_pc&fromProduct=&productBackUrl="},"extra":[]}

这里帮大家分行了,其实真是情况是没有换行的!


好了准备开始正片:

怎么解析json?

两个方案:

1.正则表达式

2..网上已经实现好的Json解析的Jar包

推荐选1,Json解析包挺难用的,如果是大神的话,就选Json解析包,后面有个玩意真心难搞......后面再说_(:зゝ∠)_


package EII;

import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regExp {
	/**
	 * 匹配单个字符串
	 * @param json
	 * @param reg
	 * @return
	 */
	public static String matcher(String json,String reg){
        Pattern pattern = Pattern.compile(reg);  
        Matcher m = pattern.matcher(json);  
        while (m.find()) {  
        	return m.group();
        }
        return "";
	}
	
	/**
	 * 匹配多个不重复的字符串
	 * @param json
	 * @param reg
	 * @return
	 */
	public static Vector<String> matcherSet(String json,String reg){
		Vector<String> ends=new Vector<>();
		 Pattern pattern = Pattern.compile(reg);  
	        Matcher m = pattern.matcher(json);  
	        while (m.find()) {  
	        	String str=m.group();
	        	if(ends.indexOf(str)==-1)
	        	ends.add(str);
	        }
	    return ends;
	}
	
	/**
	 * 匹配多个重复的字符串
	 * @param json
	 * @param reg
	 * @return
	 */
	public static Vector<String> matcherList(String json,String reg){
		Vector<String> ends=new Vector<>();
		 Pattern pattern = Pattern.compile(reg);  
	        Matcher m = pattern.matcher(json);  
	        while (m.find()) {  
	        	String str=m.group();
	        	ends.add(str);
	        }
	    return ends;
	}

}

json是需要处理的字符串

reg是模板

大多数情况,用下面这个模板就可以了

  字符串1.+?\\字符串2

结果就是:字符串1***************************字符串2

至少我是这样子的_(:зゝ∠)_

package EII;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;

public class jsonDispose {
	public static void main(String[] args) throws ClientProtocolException, IOException {
		getAllE(upLoad.upload(new File("C:\\Users\\Administrator\\Desktop\\0df431adcbef76096709930527dda3cc7cd99e2d.jpg")));
	}
	public static Vector<String> getAllE(String json) throws ClientProtocolException, IOException{
//		long l=new Date().getTime();
		json=json.replace("\\", "");
		Vector<String> allE=new Vector<>();
		String pageUrl=getpageUrl(json);
		String queryImageUrl=getQueryImageUrl(json);
		String querySign=getQuerySign(json);
		pageUrl=pageUrl.substring(0,pageUrl.length()-1);
		queryImageUrl=queryImageUrl.substring(0,queryImageUrl.length()-1);
		querySign=querySign.substring(0,querySign.length()-1);
		allE.add(pageUrl);
		allE.add(queryImageUrl);
		allE.add(querySign);
		
				
		
		String htmlSrc=new String();
		InputStream is=downLoad.client.execute(new HttpGet(pageUrl)).getEntity().getContent();
		BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));
		char[] c=new char[2048];
		while (br.read(c)!=-1) {
			htmlSrc+=new String(c);
		}
		br.close();
		is.close();
//		System.out.println(htmlSrc);
		allE.add(getKey(htmlSrc));
//		System.out.println(getKey(htmlSrc));
//		System.out.println(new Date().getTime()-l);
		return allE;
	}
	public static String getpageUrl(String json){
		return regExp.matcher(json, "\"pageUrl\":\".+?\\\"").substring(11);
	}
	public static String getQueryImageUrl(String json){
		return regExp.matcher(json, "\"imageUrl\":\".+?\\\"").substring(12);
	}
	public static String getQuerySign(String json){
		return regExp.matcher(json, "\"querySign\":\".+?\\\"").substring(13);
	}
	private static String neetKey(String pageUrlSrc){
		return regExp.matcher(pageUrlSrc, "a class=\"guess-info-word-link guess-info-word-highlight\".+?\\<");
	}
	private static String getNeetKey(String neetKey){
		return neetKey.substring(neetKey.indexOf(">")+1, neetKey.length()-1);
	}
	public static String getKey(String pageUrlSrc) throws UnsupportedOperationException, ClientProtocolException, IOException{
		String wordKey=regExp.matcher(pageUrlSrc, "'guessWord': '.+?\\'");
		boolean b=wordKey.equals("'guessWord': ''.split('");
		if(b){
			return getNeetKey(neetKey(pageUrlSrc));
		}else{			
			return wordKey.substring(14, wordKey.length()-1);
		}
	}
}
获取到结果连接也就是pageUrl后,用get请求连接,就可以得到网页结果,不过,在数据量太大的情况会可能会出现数据断层的情况,所以搞好断点传输

顺带一说里面是有关键词的,那个也要获取,一共有两种

第一种是关键词,用getKey就可以获取关键词,不过在某些情况下是找不到的,例如用图片链接去post......,之后就要用第二种了

第二种是类似于近似关键词,也就是getNeetKey去获取,类似于百度搜索结果的;你是不是要找xxx?


打算在后面几期整理下源码_(:зゝ∠)_

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值