基于java的数据处理的爬虫项目
用eclipse做一个简单的java爬虫项目,爬取百度搜索到的桔梗图片
先上百度图片里找到桔梗图片
图片链接
F12可以找到图片的地址,正则表达式将会用到。
①在eclipse新建JAVA项目与包“爬取图片”。
②在包中新建一个类,命名为Pac1
③在我的电脑C:\Users\cjy\Pictures\picture路径下创建一个文本文件,命名为123.txt。
④在类Pac1中新建代码
package 爬取图片;
//导入
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Iterator; //迭代器
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Pac1 {
//按F12打开网页源代码;找到图片容器。
//https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%BD%DB%B9%A3&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111
//下载整个页面
static String url1="https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%BD%DB%B9%A3&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111";
public static void main(String[] args) throws FileNotFoundException {
File file=new File("C:\\Users\\cjy\\Pictures\\picture\\123.txt"); //文件目录
try{URL url2=new URL(url1); //url访问链接
URLConnection con=url2.openConnection();
BufferedReader bu=new BufferedReader(new InputStreamReader(con.getInputStream())); //字符缓冲输入
FileOutputStream fi =new FileOutputStream(file);
BufferedWriter bf=new BufferedWriter(new OutputStreamWriter(fi)); 字符缓冲输出
while(bu.readLine() != null) {
String str=bu.readLine();
bf.write(str);
bf.flush(); //等待刷新
}
bf.flush();
bu.close();
bf.close();
}catch (Exception e) { //异常处理
// TODO: handle exception
}
//https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1646499984,4199068640&fm=26&gp=0.jpg
//通过正则表达式:"https://ss\\d+\\.bdstatic\\.com\\S+\\.jpg",匹配图片链接,并存储到一个set集合中。
String patter="https://ss\\d+\\.bdstatic\\.com\\S+\\.jpg";
BufferedReader bu1=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
Pattern p = Pattern.compile(patter); //匹配
int i=0;
String str1=null;
StringBuilder str2=new StringBuilder();
HashSet<String> set=new HashSet<String>();//创建set集合对象
try {
while((str1=bu1.readLine())!=null) {
str2.append(str1); //追加指定str
}
Matcher m = p.matcher(str2); //匹配
while(m.find()) { //去重
m.start();
set.add(m.group());
i++;
}
bu1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//set集合遍历
Iterator<String> it = set.iterator();
int cout=0;
while(it.hasNext()) {
cout++;
try {
String string=it.next().toString();
new Matchtest(string, cout);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); //流异常
}
}
}
}
创建另一个类Matchtest用来从存储的set集合中读取图片URL并下载到本地
package 爬取图片;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
//从存储的set集合中读取图片URL并下载到本地
//先写一张下载IO类,从set集合中每取一个出来就new 一个下载类。
public class Matchtest {
public Matchtest(String str1,int i) throws IOException {
// TODO Auto-generated method stub
File test=new File("C:\\Users\\cjy\\Pictures\\picture");
if(!test.exists()) {
test.mkdir();
}
File file=new File("C:\\Users\\cjy\\Pictures\\picture\\"+"第"+i+"张"+".jpg");
URL url = null;
try {
url = new URL(str1);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URLConnection con = null;
try {
con = url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InputStream io=con.getInputStream();
FileOutputStream fi = null;
try {
fi = new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
byte[] buf = new byte[1024];
int len = 0;
while((len=io.read(buf)) != -1) {
fi.write(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fi.close();
io.close();
}
}
保存以后就可以执行了,效果如下:
代码的注释一些已经做过标注。图片的下载路径需要是自己的路径,还有创建.txt文件用来保存下载出来的网页内容。
感谢大佬和前辈们在评论区的指点