函数计算实战-java爬虫程序从指定网站获取图片并存储到对象存储中的例子

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 阿里云函数计算推出了Java8版本的Runtime,本文结合一个java的实例完成函数计算的代码编写,该示例主要是模拟一个图片爬虫,把指定网站的指定页面的图片全部获取并保存到对象存储中。

前段时间阿里云函数计算推出了Java8版本的编译环境,我结合一个java语言来完成函数计算的代码编写,该示例主要是模拟一个网站图片爬虫,把指定网站的指定页面的图片全部获取并保存到对象存储中,画了一个简单的架构图如下:

流程讲解:

用户输入某个网站地址,并把爬虫系统部署到函数计算上,执行后函数计算会自动把某网站的图片抓取到本地,并通过内网的方式上传到对象存储(OSS)上。这里涉及到两段代码,一段是网站爬取图片的代码,一段是把图片上传到对象存储(略),我们下面结合上面的框图来看看代码构成。

  •  在函数计算上执行的代码:


/*
 * Created on 2017-9-16
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.aliyun.function.crawler;

/**
 * @author fuhw
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;

public class index implements StreamRequestHandler {
	
	private static final String URL = "https://www.csdn.com";
	private static final String ECODING = "UTF-8";
	private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
	private static final String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+)";
	
	@Override public void handleRequest(InputStream inputStream,
			OutputStream outputStream, Context context) throws IOException {
		List<String> imgUrl ;
		try {
			catchImg cm = new catchImg();
			String HTML = cm.getHTML(URL);
			imgUrl = cm.getImageUrl(HTML);
			List<String> imgSrc = cm.getImageSrc(imgUrl);
			cm.Download(imgSrc);	
		} catch (Exception e) {
			System.out.println("fail download image! ");
		}

		outputStream.write("download image is OK!".getBytes());
	}
}

  •  爬虫系统代码:
package com.aliyun.function.crawler;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class catchImg {

	// 地址
	private static final String URL = "http://www.csdn.net";

	// 编码
	private static final String ECODING = "UTF-8";

	// 获取img标签正则
	private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";

	// 获取src路径的正则
	private static final String IMGSRC_REG = "http:\"?(.*?)(\"|>|\\s+.(gif|png|jpg|bmp|jpeg|tif|tiff))";
	
	public static void main(String[] args) throws Exception {
		catchImg cm = new catchImg();
		//获得html文本内容
		String HTML = cm.getHTML(URL);
		//获取图片标签
		List<String> imgUrl = cm.getImageUrl(HTML);
		//获取图片src地址
		List<String> imgSrc = cm.getImageSrc(imgUrl);
		//下载图片
		cm.Download(imgSrc);
	}

	/***************************************************************************
	 * 获取HTML内容
	 * 
	 * @param url
	 * @return
	 * @throws Exception
	 */
	public String getHTML(String url) throws Exception {
		URL uri = new URL(url);
		URLConnection connection = uri.openConnection();
		InputStream in = connection.getInputStream();
		byte[] buf = new byte[1024];
		int length = 0;
		StringBuffer sb = new StringBuffer();
		while ((length = in.read(buf, 0, buf.length)) > 0) {
			sb.append(new String(buf, ECODING));
		}
		in.close();
		return sb.toString();
	}

	/***************************************************************************
	 * 获取ImageUrl地址
	 * 
	 * @param HTML
	 * @return
	 */
	public 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;
	}

	/***************************************************************************
	 * 获取ImageSrc地址
	 * 
	 * @param listImageUrl
	 * @return
	 */
	public List<String> getImageSrc(List<String> listImageUrl) {
		List<String> listImgSrc = new ArrayList<String>();
		for (String image : listImageUrl) {
			Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(image);
			while (matcher.find()) {
				String str = matcher.group().substring(0,
						matcher.group().length() - 1);
				listImgSrc.add(str);
			}
		}
		return listImgSrc;
	}

	/***************************************************************************
	 * 下载图片
	 * 
	 * @param listImgSrc
	 */
	public void Download(List<String> listImgSrc) {
		try {
			//System.out.println("listImgSrc size = "+listImgSrc.size());
			for (String url : listImgSrc) {
				String imageName = url.substring(url.lastIndexOf("/") + 1, url
						.length());
				URL uri = new URL(url);
				InputStream in = uri.openStream();
//				FileOutputStream fo = new FileOutputStream("/tmp/"
				FileOutputStream fo = new FileOutputStream(""
						+ new File(imageName));
				byte[] buf = new byte[1024];
				int length = 0;
				System.out.println("Start : " + url);
				while ((length = in.read(buf, 0, buf.length)) != -1) {
					fo.write(buf, 0, length);
				}
				in.close();
				fo.close();
				//System.out.println("success");
			}
		} catch (Exception e) {
			//e.printStackTrace();
			//System.out.println("fail download in void Download function");
		}
	}
}
  • 注意事项:

1、在本地java环境调试代码的时候,工程里需要引入两个包:

1)aliyun-java-sdk-fc包:http://search.maven.org/#search%7Cga%7C1%7Caliyun-java-sdk-fc

2)fc-java-core包:http://search.maven.org/#search%7Cga%7C1%7Cfc-java-core

2、把图片上传到OSS的代码参考:https://help.aliyun.com/document_detail/32013.html

3、在控制台上的程序入口书写: com.aliyun.function.crawler.index::handleRequest,格式是:包名+入口文件名::入口函数名

4、由于java是编译类型的程序,需要本地编译好后打成jar包通过函数计算控制台上传到远程,打jar包可以通过两种方式,一种可以在eclipse操作界面:

一种通过Java命令行打jar包:jar -cvf fc.jar catchImg.class index.class


5、在编写函数计算的时候,需要注意两个地方,一个是java的运行环境不能直接通过在线编译的方式来做,另外,函数入口名的书写,看下图的标注:


  • 执行看效果




相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
3天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
17 4
|
3天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
18 2
|
10天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
21 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
3天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
9天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
11 1
|
10天前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
20 1
|
10天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
30 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
10天前
|
算法 小程序 Java
java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。
24 0
|
10天前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
28 0
|
1月前
|
人工智能 自然语言处理 Serverless
阿里云函数计算 x NVIDIA 加速企业 AI 应用落地
阿里云函数计算与 NVIDIA TensorRT/TensorRT-LLM 展开合作,通过结合阿里云的无缝计算体验和 NVIDIA 的高性能推理库,开发者能够以更低的成本、更高的效率完成复杂的 AI 任务,加速技术落地和应用创新。
120 14

相关产品

  • 函数计算