(一个小白文,大神勿喷)
第一次突发奇想想写一个博客,非专业的,决定写点东西,想拿点干货出来,就想把我的识图项目拿出来开源_(:зゝ∠)_。
一个未成年,也敢写原创文章,就是因为百度到的抓取百度识图源码大都是不能运行完整的(至少我找了一段时间也没有找到),其中精易论坛的百度识图也只能获取部分源码,最多不超过100个,而且图片过大(貌似超过2MB的话),就会抓取失败
借鉴过一些教程,例如上传图片的教程、请求头设置、正则表达式等等_(:зゝ∠)_。
不说了,开始了。
最初想抓取百度识图结果,是因为百度识图是国内识图精度较高的识图之一,打算用于内部使用,不过因为我不会写UI(java的确难写,就弃坑了)
(如果有谁写出UI的话,能否给我一份:-D),似乎运用在机器训练和美工素材库方面有着绝佳地效果(当然还得看情况!_(:зゝ∠)_)
需要材料:
httpclient4.5(可能需要比较多的包)
Java
时刻开启F12
相信大家第一次上传图片的时候一定饶了很多弯路,我也是,我甚至想用按键精灵来实现图片上传的功能,不过总会有闪屏,就取消了...
上传的原理:
目标URL+参数+POST请求
代码实现:
//制造需要POST的链接
private static String getPostUrl(File img){
String upPostUrl="http://image.baidu.com/n/image?fr=html5&target=pcSearchImage&needJson=true&id=WU_FILE_0";
String fileName="&name="+URLEncoder.encode(img.getName())+"&type=image";//文件名,大都需要URL转码
Calendar cd = Calendar.getInstance();
cd.setTimeInMillis(img.lastModified()); //最后改变的时间,还是什么时间来着?
SimpleDateFormat sdf = new SimpleDateFormat("EEE%20MMM%20d%20yyyy%20HH:mm:ss%20'GMT'+0800%20", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String lastTimeName="&lastModifiedDate="+sdf.format(cd.getTime()).toString();//创造格林时间
String sizeName="&size="+img.length();//获取文件大小
//将文件名、文件大小、文件最后的修改时间和upPostUrl组合起来
upPostUrl+=fileName+lastTimeName+ "(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)"+sizeName;
return upPostUrl;
}
这种上传的链接都比较难找,我也是摸索了很久才知道,这个post的链接是在上传之后才有的
手速不快的话,根本抓不到(网速慢的好处就是获取上传目标链接十分方便:-D)
//获取Post之后的json
public static String upload(File file) throws ClientProtocolException, IOException{
//调用上面的方法,并把postURL的值用于创造HttpPost对象
HttpPost post=new HttpPost(getPostUrl(file));
/**
目前只会用设置文件实体的方式来上传文件......
MultipartEntity不会用......
*/
FileEntity entity=new FileEntity(file);
//设置文件实体
post.setEntity(entity);
//设置请求头
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");
return downLoad.download(downLoad.client.execute(post).getEntity().getContent());//获取流然后下载(downLoad是我自己写得断点传输)
}
未完待续(根据人数来决定是否要继续写下去,不过想想也挺好笑的:-D)......