跟大家分享一下关于网络爬虫核心代码,前一段代码是核心代码,后面的那一段是Demo [AppleScript] 纯文本查看 复制代码 package com.heima.catchgirl;[/p][p=30, 2, left]
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
mport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
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 CatchGirls {
//定义出这个文本文件的位置
private static final String girlsFile = "power.txt";
//这是图片的正则表达式
private static final String IMAGE_REGEX = "http:[\\.|\\w|\\d|\\/|-|%]+\\.jpg";
/**
* 需求:把文本文件里面的数据读取出来
* 功能一:把文本文件里面的数据拼接成字符串
* 功能二:把图片链接获取出来
* 功能三:把这些图片链接保存到一个文本里面
* 功能四:下载图片
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//第一步:拿到字符串
String html = getHTML(girlsFile);
//第二步:开始匹配找数据
List<String> list = matchImage(html);
//第三步:把集合里面的图片链接写出文本文件里面
printPicUrl(list);
//第四步:downLoadImage alt + shift + R 批量改名
downLoadImage(list);
}
public static void downLoadImage(List<String> list) throws Exception {
for (String picUrl : list) {
//http://img0.bdstatic.com/img/image/advertise/minutemaid.jpg
//这是截取后面的图片名称
String picName = picUrl.substring(picUrl.lastIndexOf("/")+1);
//这个对象是把字符串转成网络链接
URL url = new URL(picUrl);
//这个相当于和网络图片建立一个通道
InputStream os;
try {
os = url.openStream();
} catch (Exception e) {
continue;
//e.printStackTrace();
}
BufferedInputStream bis = new BufferedInputStream(os);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("img",picName)));
byte[] arr = new byte[1024*8*20];
int len;
while((len = bis.read(arr)) != -1){
bos.write(arr, 0, len);
}
System.out.println(picName + "....下载成功" );
bis.close();
bos.close();
}
}
/**
* 功能三:这个方法主要用于把集合里面的图片链接写出去
* @param list
* @throws Exception
*/
public static void printPicUrl(List<String> list) throws Exception {
//遍历
BufferedWriter bw = new BufferedWriter(new FileWriter("img.txt"));
for (String picUrl : list) {
bw.write(picUrl);
bw.newLine();
}
bw.close();
}
/**
* 功能二:这是匹配图片
* @param html
* @return
*/
private static List<String> matchImage(String html) {
//这个是正则的匹配器
ArrayList<String> list = new ArrayList<>();
//使用Pattern封装正则
Pattern p = Pattern.compile(IMAGE_REGEX);
Matcher matcher = p.matcher(html);
while(matcher.find()){
//group方法是获取
String picUrl = matcher.group();
//这一步:把所有的连接添加到集合里面
list.add(picUrl);
}
//返回集合
return list;
}
/**
*
* 功能一:把文本文件里面的数据全部变成字符串
* @throws Exception
*/
private static String getHTML(String girlsFile) throws Exception {
//封装file类
File file = new File(girlsFile);
BufferedReader br = null;
StringBuilder sb = new StringBuilder(); //做拼接
if(file.isFile()){
br = new BufferedReader(new FileReader(file));
String line = null; //读取到文本文件里面的行
while((line = br.readLine()) != null){
sb.append(line);
}
//sb里面添加完了所有的数据后,我应该怎么做?
}
br.close();
return sb.toString();
}
}
需要源文件的,可以下载,如果论坛附件看不到,那么我会把它传到百度网盘去,我把百度网盘的链接发出来,你们可以下载 [Java] 纯文本查看 复制代码 package com.heima.catchgirl;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class Demo {
public static void main(String[] args) throws Exception {
//demo1();
//下载一张网络图片的做法
URL url = new URL("http://tupian.enterdesk.com/2013/mxy/10/12/6/3.jpg");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
FileOutputStream fos = new FileOutputStream("1.jpg");
byte[] arr = new byte[1024*8];
int len;
while((len = is.read(arr)) != -1){
fos.write(arr, 0, len);
}
fos.close();
is.close();
}
public static void demo1() throws MalformedURLException, IOException,
UnsupportedEncodingException {
//File f = new File("aaa.txt");
//第一步:封装网络的URL
URL url = new URL("https://www.baidu.com/");
//第二步:通过URL对象得到URLConnection对象,相当于打开跟网络的连接
URLConnection conn = url.openConnection();
//第三步:得到输入流
InputStream in = conn.getInputStream();
//第四步:将得到的字节输入流转换成字符流
InputStreamReader inr = new InputStreamReader(in,"UTF-8");
BufferedReader br = new BufferedReader(inr);
String str;
while((str = br.readLine()) != null){
//写出字符串到文本?
System.out.println(str);
}
br.close();
}
}
|