上午我們學習了一下網絡爬蟲的大概論述和介紹,瞭解了現在網絡爬蟲的情況和現狀,此篇博文我們通過學習一個爬蟲的例子來深入瞭解一下如何使用網絡爬蟲,讓它更好的爲我們做更多有意思的工作。
例子的目的:通過分析一個特定的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);
}
}
下載的結果如下圖所示:接下來,我還會繼續研究爬蟲技術,將我的學習總結記錄在博客上。歡迎大家繼續訪問我的下一篇博客。