这是个简单的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
真的有东西么