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?
打算在后面几期整理下源码_(:зゝ∠)_
- Java实现抓取百度识图结果的实现和思路-2-Json的处理
- Java实现抓取百度识图结果的实现和思路-3-实现断点传输
- Java实现抓取百度识图结果的实现和思路-1-创造百度识图的URL链接
- java正则表达式的使用-抓取百度搜索的结果
- Java处理Json文件的一些思路
- PHP实现抓取HTTPS内容的方法和错误处理
- PHP实现抓取HTTPS内容的方法和错误处理
- Python抓取百度图片搜索的结果
- 一个c++版本的json实现思路
- 百度地图在处理不同形式的点时互相不影响的实现思路
- 网页防抓取的一个思路以及实现
- 网页防抓取的一个思路以及实现
- 分别使用Python和Java抓取百度搜索结果
- C#抓取百度和谷歌的搜索结果(标题和链接) 代码整理
- Java: 分页Paging的实现思路和Demo
- Sprak Java 推荐算法的思路和实现
- JAVA抓取网页的简单实现
- Java爬虫,信息抓取的实现
- Numpy中的transpose
- 牛客网模拟题-贴瓷砖
- JAVA设计模式之单例模式
- Java-线程安全问题
- 百练_4040:买书问题
- Java实现抓取百度识图结果的实现和思路-2-Json的处理
- select函数
- PAT B1029. 旧键盘
- 计算机网络总结
- 一个全面详细的gulp工作流
- Ordering Tasks(拓扑排序)
- c++中map的使用方法(一)
- HDU2838(树状数组求逆序数)
- R语言-环境系统