这是个简单的java爬虫,实现的原理通过URL获取网络数据流,url.openStream(),数据流导入到InputStream 中,用Stringbuilder储存InputStream中的数据。最后利用正则表达式,定义 Pattern类中的规则,利用 Matcher 寻找复合规则的 String ,传递 String 中的数据。通过InputStream输入图片数据,最后OutputStream 把图片保存到电脑上。

平台

eclipse

代码

package com.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test06 {
	/*
	 * 作用是学习 正则表达式
	 * 理想的做法是,下载图片
	 */
	public static void main(String [] a){
		try
		{
			String urlString;
			if(a.length > 0) urlString=a[0];//判断是否编译时输入url地址
			else urlString ="http://image.baidu.com/";
			InputStreamReader in = new InputStreamReader(new URL(urlString).openStream());
			//获取url数据流并转换为inputsteam输入流
			
			StringBuilder input = new StringBuilder();	
			//存储 InputStream 数据流中的数据
			
			int ch;
			while((ch = in.read())!= -1)//逐个字符保存 in.read()返回-1 表示数据读取完毕
				input.append((char)ch);

			System.out.println(input.toString());//打印数据

			//String patternStrng = "<a\\shref=(\"[^\"]*\"|[^//s>]*.html)\\s*>";

			String patternStrng ="http://[^\\s]*(jpg)";
			//匹配的规则 这个模块关系 正则表达式的应用,正则表达式类似于 编译原理
			Pattern pattern =Pattern.compile(patternStrng, Pattern.CASE_INSENSITIVE);
			//设置标志 可以多个标志设置
			
			Matcher matcher = pattern.matcher(input);
			//寻找匹配的类 Matcher
			System.out.println("测试中");

			//保存图片的命名规则
			String i=".jpg";
			int j=0;

			while(matcher.find()){
				int start = matcher.start();
				int end = matcher.end();
				String match =input.substring(start, end);
				//从 StringBuilder in 中截取数据
			
				URL url = new URL(match);//url获取图片的地址内容 
				File outFile = new File(j+i);
				OutputStream os=  new FileOutputStream(outFile);;
				InputStream is = url.openStream();//把图片弄到输入流里面
				byte[] buff = new byte[1024];//交换数据的byte

				while(true){//输入流和输出流交互的过程
					int readed = is.read(buff);
					if(readed==-1){
						break;//判断是否为空 跳出while循环
					}
					
					byte[] temp = new byte[readed];
					System.arraycopy(buff, 0, temp,0, readed);
					os.write(temp);
				}
				j++;
				is.close();
				os.close();
				System.out.println(match);
			}
			
		}
		catch(Exception e){
			e.getStackTrace();
		}
	}
}

正则表达式语法规则

简单示例

[Jj]java.+
匹配下列形式的所有字符串:
	1.第一个字母是J或j
	2.接下来的第三个字母是ava
	3.字符串的其余部分由一个或多个任意的字符构成

例如,字符串“javanese”就是匹配这个特定的正则表达式,但是字符串“core java”就不匹配。
语法结构:
	字符类 是一个括在括号中的可选择的字符集,例如[Jj]、[0-9]、[A-Za-z]、[^0-9]这表示的是一个范围。[^]表示一个补集(除了指定字符之外的所有字符。

Next Steps

真的有东西么