获取网页的HTML文本
想要爬取网站上的图片第一步需要先把网站的html代码爬取下来,然后在使用正则表达式先获取img标签,在根据img正则获取到得集合获取src路径,然后在遍历集合把图片保存到本地
下述代码需要使用httpclient,所以需要使用maven导入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
获取HTML文本方法
//获取HTML内容
private static String getHtml(String url) throws Exception {
URL url1 = new URL(url);//使用java.net.URL
URLConnection connection = url1.openConnection();//打开链接
InputStream in = connection.getInputStream();//获取输入流
InputStreamReader isr = new InputStreamReader(in);//流的包装
BufferedReader br = new BufferedReader(isr);
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {//整行读取
sb.append(line, 0, line.length());//添加到StringBuffer中
sb.append('\n');//添加换行符
}
//关闭各种流,先声明的后关闭
br.close();
isr.close();
in.close();
return sb.toString();
}
得到HTML内容后在根据正则表达式获取所有的img标签
img标签正则
// 获取img标签正则
private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
获取img标签文本方法
//获取ImageUrl地址
private static List<String> getImageUrl(String html) {
Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);
List<String> listimgurl = new ArrayList<String>();
while (matcher.find()) {
listimgurl.add(matcher.group());
}
return listimgurl;
}
得到img标签集合后在根据正则表达式获取图片的URL路径
src正则
// 获取src路径的正则
private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";
获取src下的URL方法
//获取ImageSrc地址
private static List<String> getImageSrc(List<String> listimageurl) {
List<String> listImageSrc = new ArrayList<String>();
for (String image : listimageurl) {
Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(image);
while (matcher.find()) {
listImageSrc.add(matcher.group().substring(0, matcher.group().length() - 1));
}
}
return listImageSrc;
}
最后遍历得到的集合调用保存图片的方法,把图片保存到本地
保存图片的方法
图片默认保存路径F:\images
图片名称默认使用UUID随机生成字符串保存
public static String doGetImage(String url) {
//获取HttpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
//设置HttpGet请求对象,设置url地址
HttpGet httpGet = new HttpGet(url);
System.out.println("当前URL:" + url);
//设置请求信息
// httpGet.setConfig(this.getConfig());
//使用HttpClient发起请求,获取响应
try (CloseableHttpResponse response = httpClient.execute(httpGet);) {
//解析响应,返回结果
if (response.getStatusLine().getStatusCode() == 200) {
//判断响应体是否不为空,如果不为空就可以使用EntityUtils
if (response.getEntity() != null) {
//下载图片
//获取图片的后缀
String extName = url.substring(url.lastIndexOf("."));
//创建图片名,重命名图片
String picName = UUID.randomUUID().toString() + extName;
String fileName = "F:\\images\\";
File file = new File(fileName);
if (!file.exists()) {
file.mkdir();
}
//下载图片
//声明OutPutStream
OutputStream outputStream = new FileOutputStream(new File(fileName + picName));
response.getEntity().writeTo(outputStream);
//返回图片名称
System.out.println("图片名称:"+picName);
}
}
} catch (IOException e) {
e.printStackTrace();
}
//如果下载失败,返回空串
return "";
}
以上代码只适用于图片路劲为完整的URL路劲,相对路径未测试
1 条评论
这里有你更精彩!