上午我们学习了一下网络爬虫的大概论述和介绍,了解了现在网络爬虫的情况和现状,此篇博文我们通过学习一个爬虫的例子来深入了解一下如何使用网络爬虫,让它更好的为我们做更多有意思的工作。
例子的目的:通过分析一个特定的url,下载该url路径下的所有图片,由于现在所学水平有限,这个例子中,没有对url循环爬取。
爬取工作主要有三步:
1、获取页面的源代码
2、解析源代码,找到源代码中图片标签
3、网络编程,下载图片
首先我们看一下项目的整体结构:
例子如下:
package cn.edu.lnu.crawler;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Util {
// 地址
private static final String URL = "http://www.tooopen.com/view/1439719.html";
// 获取img标签正则
private static final String IMGURL_REG = "<img.*src=(.*?)[^>]*?>";
// 获取src路径的正则
private static final String IMGSRC_REG = "[a-zA-z]+://[^\\s]*";
// 获取html内容
public static String getHTML(String srcUrl) throws Exception {
URL url = new URL(srcUrl);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
StringBuffer buffer = new StringBuffer();
while ((line = br.readLine()) != null) {
buffer.append(line);
buffer.append("\n");
}
br.close();
isr.close();
is.close();
return buffer.toString();
}
// 获取image url地址
public static List<String> getImageURL(String html) {
Matcher matcher = Pattern.compile(IMGURL_REG).matcher(html);
List<String> list = new ArrayList<>();
while (matcher.find()) {
list.add(matcher.group());
}
return list;
}
// 获取image src地址
public static List<String> getImageSrc(List<String> listUrl) {
List<String> listSrc = new ArrayList<String>();
for (String img : listUrl) {
Matcher matcher = Pattern.compile(IMGSRC_REG).matcher(img);
while (matcher.find()) {
listSrc.add(matcher.group().substring(0,
matcher.group().length() - 1));
}
}
return listSrc;
}
// 下载图片
private static void Download(List<String> listImgSrc) {
try {
// 开始时间
Date begindate = new Date();
for (String url : listImgSrc) {
// 开始时间
Date begindate2 = new Date();
String imageName = url.substring(url.lastIndexOf("/") + 1,
url.length());
URL uri = new URL(url);
InputStream in = uri.openStream();
FileOutputStream fo = new FileOutputStream(new File(imageName));// 文件输出流
byte[] buf = new byte[1024];
int length = 0;
System.out.println("开始下载:" + url);
while ((length = in.read(buf, 0, buf.length)) != -1) {
fo.write(buf, 0, length);
}
// 关闭流
in.close();
fo.close();
System.out.println(imageName + "下载完成");
// 结束时间
Date overdate2 = new Date();
double time = overdate2.getTime() - begindate2.getTime();
System.out.println("耗时:" + time / 1000 + "s");
}
Date overdate = new Date();
double time = overdate.getTime() - begindate.getTime();
System.out.println("总耗时:" + time / 1000 + "s");
} catch (Exception e) {
System.out.println("下载失败");
}
}
public static void main(String[] args) throws Exception {
String html = getHTML(URL);
List<String> listUrl = getImageURL(html);
/*
* for(String img : listUrl){ System.out.println(img); }
*/
List<String> listSrc = getImageSrc(listUrl);
/*
* for(String img : listSrc){ System.out.println(img); }
*/
Download(listSrc);
}
}
下载的结果如下图所示:
接下来,我还会继续研究爬虫技术,将我的学习总结记录在博客上。欢迎大家继续访问我的下一篇博客。