您的位置:首页 > 编程语言 > Java开发

Java使用正则表达式抓取Bing首页每日图片

2017-06-27 17:40 369 查看

Java学习到了正则表达式,总想做点有用的东西,这两天想给电脑换壁纸,看到Bing每天的主页图片挺好看的,就寻思着抓下来。

第一步就是分析主页的结构了这个Bing的主页图片直接使用小箭头抓是抓不到的,在Network的Img里我们可以找到图片所在处:



把链接copy下来,在Element里面搜索我们边可以看到链接是在一个JS脚本里面的,这个时候就比较清楚我们要怎么搞了,



链接所在的那一片弄出来就是这个样子了

g_img={url: “/az/hprichbg/rb/LoxodontaAfricana_ZH-CN10434704249_1920x1080.jpg”}

把这个东东里的链接搞出来加上 http://cn.bing.com 就是我们需要的图片链接了,那么这个正则表达式写出来就是

"g_img=\\{url: \"([\\w_\\-/]+?\\.jpg)\""


我开始找的时候把后面的”}”加上去发现找不到链接,只好使用这个了,在找到链接后我们就可以获取到图片的二进制内容,写入Java的文件中保存起来了。这里又学习了一点Java的文件知识,如何判断一个文件是否已经存在,新建文件,写入二进制等东西。

具体的代码就是下面了,也不是很多,就几十行

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.FileAlreadyExistsException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetBingPicture {
public static void main(String[] args) throws Exception {
GetBingPicture getBingPicture = new GetBingPicture();
String  home = "http://cn.bing.com";
// 获取链接
String url = getBingPicture.GetUrl(home);
// 保存图片
getBingPicture.SavePicture(home + url);
}

private String GetUrl(String home_url) throws Exception {
InputStream is = new URL(home_url).openStream();
byte[] buff = new byte[1024];
StringBuilder builder = new StringBuilder();
// 得到界面的字符串
while (is.read(buff, 0, buff.length) > 0) {
// 需要使用String的编码解码
builder.append(new String(buff, "UTF-8"));
}
is.close();
// 开始正则匹配
Matcher matcher = Pattern.compile("g_img=\\{url: \"([\\w_\\-/]+?\\.jpg)\"").matcher(builder.toString());
// 找链接
if (matcher.find()) {
System.out.println("Find the url: " + matcher.group(1));
return matcher.group(1);
} else {
throw new Exception("Not found the url");
}
}
// 保存函数
private void SavePicture(String url) throws IOException {
// 打开链接
InputStream is = new URL(url).openStream();
// 链接处理一下得到名字
int start = url.lastIndexOf("/") + 1;
int end = url.indexOf("_");
// 拼接出名字,substring函数前闭后开
String name = url.substring(start, end) + ".jpg";
File file = new File(name);
// 判断是否已经存在
if (file.exists())  {
throw new  FileAlreadyExistsException(name + " has existed");
} else {
// 创建文件
file.createNewFi
4000
le();
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while ((len = is.read(buff, 0, buff.length)) > 0) {
fileOutputStream.write(buff, 0, len);
}
System.out.println(name + " was downloaded successfully");
// 关掉才能保存到磁盘里
fileOutputStream.close();
}
is.close();
}
}


其实我发现由于整个页面中只有一个g_img={url: ,那么直接字符串搜索我估计也是可以的,这个方法我用python实现了一下,代码短了不少,上链接啦python字符串查找实现

大家一起学习吧

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息