기능에 제약이 있는 free버전이다.
// Parse through page contents and retrieve links.
private ArrayList<String> retrieveLinks(URL pageUrl, String pageContents,
HashSet crawledList, boolean limitHost) {
// Compile link matching pattern.
Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(.*?)[\"|>]", //<a href=""> 이런 것을 걸러냄
Pattern.CASE_INSENSITIVE); //String이 컴파일될때 패턴을 지정 -> JAVA의 정규표현식
Matcher m = p.matcher(pageContents); //정규표현식에 맞는지 매칭시켜본다.
// Create list of link matches.
ArrayList<String> linkList = new ArrayList<String>();
while (m.find()) { //매치가 되면 계속 돌아간다.
String link = m.group(1).trim(); // s.substring(m.start(1), m.end(1))와 같은 표현
// 매칭된 것 중 첫번째에서 link만 잘라내어 저장
// Skip empty links. //링크가 비어있다면
if (link.length() < 1) {
continue;
}
// Skip links that are just page anchors.
if (link.charAt(0) == '#') { //#을 쓴 링크라면
continue;
}
// Skip mailto links.
if (link.indexOf("mailto:") != -1) {//메일이 link되어 있다면
continue;
}
// Skip JavaScript links. //javascript가 link 되어 있다면
if (link.toLowerCase().indexOf("javascript") != -1) {
continue;
}
// Prefix absolute and relative URLs if necessary.
if (link.indexOf("://") == -1) { // 이런 형식(://)이 없다면
// Handle absolute URLs.
if (link.charAt(0) == '/') { // 슬래쉬(/)로 시작하는 절대 url일 경우 (예) /blog/hagi
link = "http://" + pageUrl.getHost() + link; //앞에 http://를 붙인다.
// Handle relative URLs.
} else { //상대 경로
String file = pageUrl.getFile();
if (file.indexOf('/') == -1) { /* index.html과 같은 경우 (슬래쉬가 완전 없는 경우)*/
link = "http://" + pageUrl.getHost() + "/" + link;
} else { /* blog/hagi 같이 슬래쉬(/)를 쓰지 않은 경우 */
String path = file.substring(0,
file.lastIndexOf('/') + 1);
link = "http://" + pageUrl.getHost() + path + link;
}
}
}
// Remove anchors from link. //link에 #이 있다면 그전까지 자른다.
int index = link.indexOf('#');
if (index != -1) {
link = link.substring(0, index);
}
// Remove leading "www" from URL's host if present.
link = removeWwwFromUrl(link); //www를 잘라냄
// Verify link and skip if invalid.
URL verifiedLink = verifyUrl(link);
if (verifiedLink == null) {
continue;
}
/*
* If specified, limit links to those having the same host as the
* start URL.
* 나의 로봇 시작 페이지가 http://daum.net이고
*/ //abc.html의 상위주소가 http://daum.net이라면 이것은 걸러낸다.
if (limitHost
&& !pageUrl.getHost().toLowerCase().equals(
verifiedLink.getHost().toLowerCase())) {
continue;
}
// Skip link if it has already been crawled.
if (crawledList.contains(link)) { //이미 crawledList에서 수집된 정보라면 넘어간다.
continue;
}
// Add link to list.
linkList.add(link); //모두 아니라면 linkList에 저장
}
return (linkList);
}