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

简介: 阿里云函数计算推出了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的运行环境不能直接通过在线编译的方式来做,另外,函数入口名的书写,看下图的标注:


  • 执行看效果




相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
10月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
285 2
|
10月前
|
编解码 数据处理 API
如何用阿里云OSS对图片和视频进行数据处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。OSS提供了丰富的功能,如图片的缩放、裁剪、旋转和水印添加等,用户只需在图片URL后附加处理参数即可实现自动化处理。同时,OSS还支持自定义样式模板,便于批量操作。对于视频处理,OSS支持转码、截图、拼接等功能,满足多终端播放需求。通过OSS的API和SDK,开发者可以方便地集成这些功能,提升数据管理效率。
|
8月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
397 98
|
12月前
|
存储 编解码 Serverless
Serverless架构下的OSS应用:函数计算FC自动处理图片/视频转码(演示水印添加+缩略图生成流水线)
本文介绍基于阿里云函数计算(FC)和对象存储(OSS)构建Serverless媒体处理流水线,解决传统方案资源利用率低、运维复杂、成本高等问题。通过事件驱动机制实现图片水印添加、多规格缩略图生成及视频转码优化,支持毫秒级弹性伸缩与精确计费,提升处理效率并降低成本,适用于高并发媒体处理场景。
1447 0
|
10月前
|
存储 编解码 API
如何利用阿里云OSS进行图片和视频处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。内容包括OSS的基本功能、上传与管理媒体资源、图片处理(缩放、裁剪、旋转、水印等)、视频处理(转码、截图、拼接等)以及相关API的使用方法。通过OSS,用户可高效实现多媒体资源的存储与处理,适用于各类企业和开发者。
|
9月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
315 0
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
884 22
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
691 6

相关产品

  • 函数计算