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

来源:互联网 发布:paxos算法论文 编辑:程序博客网 时间:2024/05/16 08:38

上一篇文章的断点传输以后再讲_(:зゝ∠)_,先讲讲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?


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

原创粉丝点击